2017-01-20 3 views
0

Я хочу проанализировать мое устройство воспроизведения по умолчанию и обнаружить биты. Я использую BASS WASAPI, чтобы получить FFT данные выбранного устройства с:BASS WASAPI BPMCounter

int ret = BassWasapi.BASS_WASAPI_GetData(_fft, (int)BASSData.BASS_DATA_FFT2048); 

Теперь я использую данные для получения данных спектра и отображать его пользователю. Кроме того, я хочу обнаружить Beats, используя класс BPMCounter от BASS. Однако, насколько я могу судить, для функции BPMCounter.ProcessAudio() требуется поток (который я не получаю с WASAPI) для работы. Есть ли способ использовать BPMCounter с WASAPI? Было бы здорово, если бы кто-то мог указать мне в правильном направлении. Благодаря

Edit: Пробовал это, чтобы преобразовать данные в поток, но без успеха:

int ret = BassWasapi.BASS_WASAPI_GetData(_fft, (int)BASSData.BASS_DATA_FFT2048); //get channel fft data 
var chan = Bass.BASS_StreamCreate(0, 44100, BASSFlag.BASS_DEFAULT, BASSStreamProc.STREAMPROC_PUSH); 
Bass.BASS_ChannelPlay(chan, false); 
Bass.BASS_StreamPutData(chan, _fft, _fft.Length); 
bool beat = _count.ProcessAudio(chan, true); 
Debug.Write(beat); 

beat всегда False, однако я могу видеть в спектре, что отлов БПФ данных является corrent ,

ответ

1

Я только начал играть с этой библиотекой несколько часов назад, и я все еще просматриваю примеры. Поэтому мой ответ может быть не тем, что вы хотите. Для моего проекта я также хочу преобразовать WASAPI в поток и использовать его для отображения спектра. Я сделал, чтобы создать StreamPush, сразу после инициализации BASS_WASAPI.

Чтобы инициализировать ваш WASAPI использовать этот вызов, и этот делегат:

private InitWasapi() 
{ 
    WASAPIPROC _process = new WASAPIPROC(Process); // Delegate 
    bool res = BassWasapi.BASS_WASAPI_Init(_YourDeviceNumber, 0, 0, BASSWASAPIInit.BASS_WASAPI_BUFFER, 1f, 0f, _process, IntPtr.Zero); 
    if (!res) 
    { 
    // Do error checking 
    }  

    // This is the part you are looking for (maybe!) 
    // Use these flags because Wasapi needs 32-bit sample data 
    var info = BassWasapi.BASS_WASAPI_GetInfo(); 
    _stream = Bass.BASS_StreamCreatePush(info.freq, info.chans, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT, IntPtr.Zero); 

    BassWasapi.BASS_WASAPI_Start(); 
} 

private int Process(IntPtr buffer, int length, IntPtr user) 
{ 
    Bass.BASS_StreamPutData(_stream, buffer, length); 
    return length; 
} 

Обратите внимание: Это работает, но я все еще экспериментировать. Например, я не получаю такой же спектр, как при создании потока из самого музыкального файла. Есть несколько (небольших) различий. Возможно, это потому, что я использую пользовательский эквалайзер в Winamp для воспроизведения того же .mp3. Поэтому, если кто-то знает больше об этом, я бы тоже хотел его услышать!

Смежные вопросы