Author Topic: Проблема фиксации длины буфера записи в bass.dll  (Read 620 times)

mihail52

  • Posts: 1
Здравствуйте. Простите за мой английский. Очень стараюсь найти решение моей проблемы с bass.dll.
Моя программа считывает звук с микрофона и обрабатывает его. Загвоздка в том, что до длина буфера, которым оперирует коллбек не статична.
length = 5512, 11024, 8268, 8268, 8268, 11024, 8268...
Долго изучал справку, но так и не нашел как зафиксировать длину буфера.

Вот так происходит захват звука:
Code: [Select]
rchan = BASS_RecordStart(FREQ,CHANS,0,&DuffRecording,0);  // rchan - канал записи
Code: [Select]
BOOL CALLBACK DuffRecording(HRECORD hangle, const void *buffer, DWORD lenght, void *user)
  {
  if((reclen % BUFSTEP) + lenght >= BUFSTEP)  // динамическое выделение памяти под поток
     recbuf = (char *)realloc(recbuf,((reclen + lenght) / BUFSTEP + 1) * BUFSTEP);
  memcpy(recbuf+reclen,buffer,lenght);  // recbuf - массив данных
  reclen+=lenght;  // reclen - длина массива recbuf
  return TRUE;
  }
Мне необходимо организовать обработку звука в режиме реального времени. Поэтому главное для меня сейчас - закрепить длину буфера. Среди вас есть те, кто имел дело с подобной проблемой?
« Last Edit: 9 Feb '15 - 13:20 by mihail52 »

Ian @ un4seen

  • Administrator
  • Posts: 20389
You can receive the recorded data in fixed-length blocks by not using a RECORDPROC callback, and instead using BASS_ChannelGetData in a timer. Something like this...

Code: [Select]
rchan = BASS_RecordStart(FREQ,CHANS,0,0,0); // start recording without a RECORDPROC

...

// in a timer or worker thread
while (1) {
int avail=BASS_ChannelGetData(rchan, 0, BASS_DATA_AVAILABLE); // get amount of data in recording buffer
if (avail<BLOCKLEN) break; // not enough data to process a block
BYTE buffer[BLOCKLEN];
BASS_ChannelGetData(rchan, buffer, BLOCKLEN); // get a block of data
// process it
}