Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побайтное воспроизвидение wav 
:(
    Опции темы
mishapk
  Дата 26.1.2012, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
Имеется устройство при подачи на которое через порт RS232 поблочно wav файл, на устройстве происходит его воспроизведение.
Проблема в том, что с какой скоростью мы этот файл зальем с такой скоростью он и воспроизведется.

1. Подскажите как вычислить задержку что бы она соответствовала реальности. На мой слух задержка равна 20мл.сек.

Код

while(!feof(fin))
{
 Sleep(20);
fread(&a,sizeof(a),1,fin);
WriteFile(hComm,&a,320,&dwBytesWrite,NULL);
}



2. Сопутствующий вопрос. Как из фала wav извлечь data раздел - пропустить заголовок и если есть что то в конце пропустить его тоже.
PM MAIL   Вверх
tzirechnoy
Дата 26.1.2012, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



1) Очевидно, что разница между записью в миллисекундах должна быть равна 1000*samplecount/samplerate, где samplecount -- сколько звуковых значений пишэтся в порт за один раз, в Вашэм примере 320 / 1, 2 или 4 в зависимости от количества бит в аудиопотоке .wav-файла (/1 или /2 для 8-бит и /2 или /4 для 16-бит) и количества каналов (/1 или /2 в моно- и /2 или /4 в стереофайле), а samplerate -- частота дискретизацыи, в Вашэм примере -- из метаинформацыи .wav-файла.
Замечу, что простые устройства воспроизведения (а у Вас, кажэтся, именно простое) требуют одного конретного формата, и если данные в .wav-файле им не соответствуют, то требуется их перекодировать. Для количества каналов (ну, в пределах 2-х) это просто, для разрешэния -- тожэ. Смена частоты дискретизацыи требует некоторых мыслительных затрат.
2) Возьмите какую-нибудь библиотеку для чтения .wav, например, libsndfile.

Добавлено через 1 минуту и 3 секунды
1) Очевидно, что разница между записью в миллисекундах должна быть равна 1000*samplecount/samplerate, где samplecount -- сколько звуковых значений пишэтся в порт за один раз, в Вашэм примере 320 / 1, 2 или 4 в зависимости от количества бит в аудиопотоке .wav-файла (/1 или /2 для 8-бит и /2 или /4 для 16-бит) и количества каналов (/1 или /2 в моно- и /2 или /4 в стереофайле), а samplerate -- частота дискретизацыи, в Вашэм примере -- из метаинформацыи .wav-файла.
Замечу, что простые устройства воспроизведения (а у Вас, кажэтся, именно простое) требуют одного конретного формата, и если данные в .wav-файле им не соответствуют, то требуется их перекодировать. Для количества каналов (ну, в пределах 2-х) это просто, для разрешэния -- тожэ. Смена частоты дискретизацыи требует некоторых мыслительных затрат.
2) Возьмите какую-нибудь библиотеку для чтения .wav, например, libsndfile.

Добавлено через 3 минуты и 5 секунд
1) Очевидно, что разница между записью в миллисекундах должна быть равна 1000*samplecount/samplerate, где samplecount -- сколько звуковых значений пишэтся в порт за один раз, в Вашэм примере 320 / 1, 2 или 4 в зависимости от количества бит в аудиопотоке .wav-файла (/1 или /2 для 8-бит и /2 или /4 для 16-бит) и количества каналов (/1 или /2 в моно- и /2 или /4 в стереофайле), а samplerate -- частота дискретизацыи, в Вашэм примере -- из метаинформацыи .wav-файла.
Замечу, что простые устройства воспроизведения (а у Вас, кажэтся, именно простое) требуют одного конретного формата, и если данные в .wav-файле им не соответствуют, то требуется их перекодировать. Для количества каналов (ну, в пределах 2-х) это просто, для разрешэния -- тожэ. Смена частоты дискретизацыи требует некоторых мыслительных затрат.
2) Возьмите какую-нибудь библиотеку для чтения .wav, например, libsndfile.
PM MAIL   Вверх
borisbn
Дата 27.1.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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




Модератор: Сообщение скрыто.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mishapk
Дата 27.1.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не совсем понял. В общем формат файла 16 бит 8 кгц моно, 128 кбит/ сек. Как теперь подсчитать?
PM MAIL   Вверх
borisbn
Дата 27.1.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(mishapk @  27.1.2012,  10:24 Найти цитируемый пост)
формат файла 16 бит 8 кгц моно

вроде ж несложно:
за 1/8000 секунды должно уйти 2 байта.
такую задержку Sleep'ом не сделаешь.
вот, лови
Код

#define Sleep_mks(mks) { \
            LARGE_INTEGER F,P1,P2; QueryPerformanceFrequency(&F); QueryPerformanceCounter(&P2); \
            P2.QuadPart+=(__int64)mks*(__int64)((double)F.QuadPart/1e6); \
            do { QueryPerformanceCounter(&P1); } while (P1.QuadPart < P2.QuadPart); }



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mishapk
Дата 27.1.2012, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Наверное 320/16=20

Добавлено через 4 минуты и 3 секунды
Именно Sleep(20) на слух в самый раз при 320 байт в сек на порт 
PM MAIL   Вверх
tzirechnoy
Дата 27.1.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



1000*(320/2)/8000. Но учтите, это -- разница между записью (в миллисекундах). Поскольку на read/write уходит некоторое время, лучшэ воспользоваться функцыями времени для определени задержки или спецыальными таймерами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

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


 




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


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

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