@mmisin1
Студент

Как закрепить длину буфера записи в bass.dll?

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

Вот так происходит захват звука:
rchan = BASS_RecordStart(FREQ,CHANS,0,&DuffRecording,0);  // rchan - канал записи

коллбек:
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;
  }

Организация не самая лучшая. Буду исправлять многое в коллбеке. Но главное для меня сейчас - закрепить длину буфера. Вы имели дело с подобной проблемой?
  • Вопрос задан
  • 2537 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Типовое решение этой проблемы -- накапливать данные у себя и обрабатывать, когда накоплено столько, сколько нужно. Совсем тупая реализация на С:

char *buf;
size_t buf_sz;
...
BOOL CALLBACK DuffRecording(HRECORD hangle, const void *buffer, DWORD lenght, void *user)
{
  buf = realloc(buf, buf_sz + length);
  memcpy(buf + buf_sz, buffer, lenght);
  buf_sz += length;
  return TRUE;
}

// эту функцию нужно вызывать когда есть новые данные,
// например, после каждого вызова DuffRecording
void chunk_handler(void)
{
  size_t offset = 0;
  while (buf_sz >= offset + CHUNK_SIZE) {
    do_something_with_data(buf + offset);
    offset += CHUNK_SIZE;
  }
  if (offset) {
    memmove(buf, buf + offset, buf_sz - offset);
    buf_sz -= offset;
  }
}

// эта функция будет вызвана с p указывающим на буфер длиной CHUNK_SIZE
void do_something_with_data(void *p)
{
  ...
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы