Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фиксация длины буфера записи в BASS.DLL, Статичный буфер для потоковой обработки 
:(
    Опции темы
Миша52
Дата 8.2.2015, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.9.2014

Репутация: нет
Всего: нет



Здравствуйте. Очень стараюсь найти решение моей проблемы с 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;
  }

Организация не самая лучшая. Буду исправлять многое в коллбеке. Но главное для меня сейчас - закрепить длину буфера. Среди вас есть те, кто имел дело с подобной проблемой?
PM MAIL   Вверх
feodorv
Дата 9.2.2015, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Миша52 @  8.2.2015,  19:03 Найти цитируемый пост)
длина буфера, которым оперирует коллбек, не статична

Она и не должна быть одинаковой. Да и зачем Вам одинаковая? Какой выйгрыш от этого Вы хотите получить?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Миша52
Дата 9.2.2015, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.9.2014

Репутация: нет
Всего: нет



Цитата(feodorv @ 9.2.2015,  01:51)
Цитата(Миша52 @  8.2.2015,  19:03 Найти цитируемый пост)
длина буфера, которым оперирует коллбек, не статична

Она и не должна быть одинаковой. Да и зачем Вам одинаковая? Какой выйгрыш от этого Вы хотите получить?

Мне необходимо осуществить захват, обработку и вывод данных в реальном времени (БПФ, автокорреляция, фильтрация). Мне посоветовали очень хороший алгоритм, но в нем буфер должен быть обязательно статичным. 
user posted image
user posted image
Необходимо выиграть время. Получил данные, сразу же обработал, сохранил и отправил на вывод.
А как Вы видите реализацию подобной задачи?

Это сообщение отредактировал(а) Миша52 - 9.2.2015, 09:03
PM MAIL   Вверх
feodorv
Дата 10.2.2015, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Миша52 @  9.2.2015,  09:01 Найти цитируемый пост)
но в нем буфер должен быть обязательно статичным. 

В смысле? Передаваемые данные этому алгоритму должны быть одного размера?


Цитата(Миша52 @  9.2.2015,  09:01 Найти цитируемый пост)
А как Вы видите реализацию подобной задачи?

Заведите в callback'е буфер нужного размера, и докладывайте туда данные, пока он не заполнится, затем передавайте его в алгоритм. Избытки данных потом сохраняйте в нём же, но с его начала.


Однопоточное решение, избегающее лишнего копирования видится мне таким:
Код

unsigned char recvBuf[ALG_SIZE];
unsigned int recvLength = 0;

BOOL CALLBACK DuffRecording(HRECORD hangle, const void *buffer, DWORD lenght, void *user)
{
  if( recvLength > 0 ) // с прошлого раза есть остатки данных
  {
    unsigned int rest = ALG_SIZE - recvLength;

    if( length < rest ) // новых данных мало, чтобы заполнить весь буфер
    {
      memcpy( &recvBuf[recvLength], buffer, length);
      recvLength += length;
      return TRUE;
    }

    memcpy( &recvBuf[recvLength], buffer, rest);
    buffer = (unsigned char *) buffer + rest;
    length -= rest;

    algorythm( recvBuf ); // отправляем в алгоритм накопленные ALG_SIZE байт
    recvLength = 0;
  }

  while( length > 0 )
  {
    if( length < ALG_SIZE ) // данных осталось маловото
    {
      memcpy( recvBuf, buffer, length); // остатки данных бережно сохраняем
      recvLength = length;
      return TRUE;
    }

    algorythm( buffer ); // вместо копирования сразу отправляем в алгоритм данные
    buffer = (unsigned char *) buffer + ALG_SIZE;
    length -= ALG_SIZE;
  }

  return TRUE;
}


Правда, после всего-всего в буфере recvBuf могут остаться данные (то есть по окончании всех вызовов DuffRecording значение recvLength может отличаться от нуля). Как Вы будете утилизировать эти остатки при таком алгоритме, который фиксирует размер передаваемых ему данных, мне представить себе сложно.


Это сообщение отредактировал(а) feodorv - 10.2.2015, 03:07


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.