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

А надо
Второй — использовал waveOut API. Декодируем звук в PCM (Или сразу его храним в ресурсах или файле как PCM). Задаем устройство используя информацию из waveOutGetDevCaps и открыая его через waveOutOpen.
Все отлично — но для очень коротких сэмплов.
Что нибудь мало мальски длинное (больше ~ 15 сек) или непрерывный повтор одного и того же сэмпла начнет щелкать. Причина рассинхронизация таймера системы используемого для посыла сэмпла в линию и таймера звуковой платы. Писать синхронизацию не хочу, это уже перебор.
Подскажите пожалуйста ПРОСТОЙ способ проигрывания аудио в Windows для заданного устройства.
Заранее спасибо.
Здравствуйте, ogo, Вы писали:
ogo>Подскажите пожалуйста ПРОСТОЙ способ проигрывания аудио в Windows для заданного устройства.
ogo>Заранее спасибо.
waveOut и есть простой способ. Просто нужно использовать несколько буферов.
Здравствуйте, metaller, Вы писали:
M>waveOut и есть простой способ. Просто нужно использовать несколько буферов.
Спасибо, но как я уже написал это не так. Возможно я плохо это пояснил, попробую ещё раз.
Использование нескольких буферов это понятно, я так и делаю. Но для этого надо отслеживать обратную связь с окончанием проигрывания буферов.
Самый простой способ играть звук waveOut это: запускаем таймер (предположим на 100 милисекунд) и посылаем сэмплы по 100 милисекунд. С начала все будет работать, но — потом звук начнет щёлкать на стыках сэмплов из-за пауз. Причина — рассинхронизация. Именно использование нескольких буферов и дает этот эффект. Бороться с ней не просто. Можно конечно посылать через 99 милисек 100 милисек сэмплы и прочие хитрости, но все это криво

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

Если совсем уж упрощать, можно потратить 15 минут для написания собственной обертки или класса/компонента. Да и готовых в сети — вагонами

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