проигрывание WAV файла средствами windows API
От: ogo Россия  
Дата: 06.11.05 14:11
Оценка:
Добрый день,

Не могу найти способ просто и без хлопот проиграть аудио sample на заданное устройство в Windows.

Я пробовал это сделать двумя способами. Первый очень простой — PlaySound(MAKEINTRESOURCE(a_res_id), hInst, flags);
Все отлично работает но — нет способа задать выходное устройство А надо

Второй — использовал waveOut API. Декодируем звук в PCM (Или сразу его храним в ресурсах или файле как PCM). Задаем устройство используя информацию из waveOutGetDevCaps и открыая его через waveOutOpen.
Все отлично — но для очень коротких сэмплов.
Что нибудь мало мальски длинное (больше ~ 15 сек) или непрерывный повтор одного и того же сэмпла начнет щелкать. Причина рассинхронизация таймера системы используемого для посыла сэмпла в линию и таймера звуковой платы. Писать синхронизацию не хочу, это уже перебор.

Подскажите пожалуйста ПРОСТОЙ способ проигрывания аудио в Windows для заданного устройства.
Заранее спасибо.
Re: проигрывание WAV файла средствами windows API
От: metaller  
Дата: 07.11.05 02:23
Оценка:
Здравствуйте, ogo, Вы писали:

ogo>Подскажите пожалуйста ПРОСТОЙ способ проигрывания аудио в Windows для заданного устройства.

ogo>Заранее спасибо.
waveOut и есть простой способ. Просто нужно использовать несколько буферов.
Re[2]: проигрывание WAV файла средствами windows API
От: Аноним  
Дата: 07.11.05 09:09
Оценка:
Здравствуйте, metaller, Вы писали:

M>waveOut и есть простой способ. Просто нужно использовать несколько буферов.


Спасибо, но как я уже написал это не так. Возможно я плохо это пояснил, попробую ещё раз.
Использование нескольких буферов это понятно, я так и делаю. Но для этого надо отслеживать обратную связь с окончанием проигрывания буферов.
Самый простой способ играть звук waveOut это: запускаем таймер (предположим на 100 милисекунд) и посылаем сэмплы по 100 милисекунд. С начала все будет работать, но — потом звук начнет щёлкать на стыках сэмплов из-за пауз. Причина — рассинхронизация. Именно использование нескольких буферов и дает этот эффект. Бороться с ней не просто. Можно конечно посылать через 99 милисек 100 милисек сэмплы и прочие хитрости, но все это криво Хотелось бы делать все правильно.
Re[3]: проигрывание WAV файла средствами windows API
От: Аноним  
Дата: 07.11.05 10:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, metaller, Вы писали:


M>>waveOut и есть простой способ. Просто нужно использовать несколько буферов.


А>Использование нескольких буферов это понятно, я так и делаю. Но для этого надо отслеживать обратную связь с окончанием проигрывания буферов.

А>Самый простой способ играть звук waveOut это: запускаем таймер (предположим на 100 милисекунд) и посылаем сэмплы по 100 милисекунд. С начала все будет работать, но — потом звук начнет щёлкать на стыках сэмплов из-за пауз. Причина — рассинхронизация. Именно использование нескольких буферов и дает этот эффект. Бороться с ней не просто. Можно конечно посылать через 99 милисек 100 милисек сэмплы и прочие хитрости, но все это криво Хотелось бы делать все правильно.

Бороться с ними просто. Надо в очередь добавлять больше одного буфера (два как минимум) и в коллбеке добавлять следующий. Щелчков не будет. Ну а самый простой способ играть WAV-ы при помощи waveOut — делать один буфер размером с файл
Re[4]: проигрывание WAV файла средствами windows API
От: Аноним  
Дата: 07.11.05 11:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Бороться с ними просто. Надо в очередь добавлять больше одного буфера (два как минимум) и в коллбеке добавлять следующий. Щелчков не будет. Ну а самый простой способ играть WAV-ы при помощи waveOut — делать один буфер размером с файл


Спасибо за толковый совет. Вы описали простейшую синхронизацию, Наверно так и придется делать. Мечталось что есть магическая функция для более простого проигрывания файлов
Re[5]: проигрывание WAV файла средствами windows API
От: KaBoom Чехия  
Дата: 08.11.05 07:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо за толковый совет.


Всегда пожалуйста

A> Мечталось что есть магическая функция для более простого проигрывания файлов


Да куда уж проще? Если совсем уж упрощать, можно потратить 15 минут для написания собственной обертки или класса/компонента. Да и готовых в сети — вагонами Основная проблема — правильно считать RIFF-заголовок и выставить формат вывода устройства. Ну и коллбек прикрутить. Тут была живейшая дискуссия насчет того, как в качестве stdcall callback функции использовать методы класса. Способ есть, хакерский конечно, но работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.