int size=BASS_ChannelGetData(chan,fft,4096|BASS_DATA_AVAILABLE);
fwrite(fft,size,1,fp);
Как записать WAV файл?
Код:
BASS_ChannelPlay(chan, FALSE); // play it
BASS_ChannelGetInfo(chan,&info);
T=BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetLength(chan, BASS_POS_BYTE));
strcpy(wh.chunkId, "RIFF");
strcpy(wh.format, "WAVE");
strcpy(wh.subchunk1Id, "fmt ");
strcpy(wh.subchunk2Id, "data");
wh.numChannels=info.chans;
wh.sampleRate=info.freq;
wh.bitsPerSample=info.origres;
wh.subchunk1Size=16;
wh.subchunk2Size=T*wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.chunkSize=4+(8+wh.subchunk1Size)+(8+wh.subchunk2Size);
wh.audioFormat=0x0001;
wh.byteRate=wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.blockAlign=wh.numChannels*wh.bitsPerSample/8;
fwrite(&wh,sizeof(WAVHEADER),1,fp);
while (BASS_ChannelIsActive(chan)!=BASS_ACTIVE_STOPPED)
{
BASS_ChannelGetData(chan,fft,4096);
fwrite(fft,sizeof(fft),1,fp);
}
BASS_ChannelGetInfo(chan,&info);
T=BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetLength(chan, BASS_POS_BYTE));
strcpy(wh.chunkId, "RIFF");
strcpy(wh.format, "WAVE");
strcpy(wh.subchunk1Id, "fmt ");
strcpy(wh.subchunk2Id, "data");
wh.numChannels=info.chans;
wh.sampleRate=info.freq;
wh.bitsPerSample=info.origres;
wh.subchunk1Size=16;
wh.subchunk2Size=T*wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.chunkSize=4+(8+wh.subchunk1Size)+(8+wh.subchunk2Size);
wh.audioFormat=0x0001;
wh.byteRate=wh.sampleRate*wh.numChannels*wh.bitsPerSample/8;
wh.blockAlign=wh.numChannels*wh.bitsPerSample/8;
fwrite(&wh,sizeof(WAVHEADER),1,fp);
while (BASS_ChannelIsActive(chan)!=BASS_ACTIVE_STOPPED)
{
BASS_ChannelGetData(chan,fft,4096);
fwrite(fft,sizeof(fft),1,fp);
}
Цитата:
If an error occurs, -1 is returned, use BASS_ErrorGetCode to get the error code. When requesting FFT data, the number of bytes read from the channel (to perform the FFT) is returned. When requesting sample data, the number of bytes written to buffer will be returned (not necessarily the same as the number of bytes read when using the BASS_DATA_FLOAT flag). When using the BASS_DATA_AVAILABLE flag, the number of bytes in the channel's buffer is returned.
Вообще, там неплохая документация. Стоило бы покурить.
Код:
Проверь, какое число возвращает функция и, если это -1, то вызови BASS_ErrorGetCode. В документации к библиотеке написаны, какие коды какие ошибки обозначают.
szie = 4096, а BASS_ErrorGetCode = 0. Я так понимаю, что последний флаг и делает этот код бессмысленным?
К тому же, ноль вернётся только тогда, когда либо из канала ничего не считалось, либо в буффер ничего не записалось.
Тогда как мне получить PCM данные с помощью этой функции? Использовать флаг BASS_DATA_FLOAT?
Немного покурив, понял, что можно воспроизводить из памяти. Реально ли полученный массив обрабатывать и воспроизводить?