![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Своевременное заполнение DirectSoundBuffer-а
cyborg © (2003-11-26 18:40:00)Задача стоит в своевременном заполнении буфера iDirectSoundBuffer, который постоянно проигрывается. Декодирую OGG файл в буфер, напимер 16 килобайт (размер без разницы), как мне в программе узнавать, что в буфер (DirectSoundBuffer) пора дописать новые данные?
Есть ли в DirectSoundBuffer какое нибудь событие, сообщающее, что пора заполнить буфер?
Сегодня безрезультатно целый день промучался :(.
Пытался воспользоваться функцией
GetCurrentPosition(@PlayPosition, @WritePosition);
только ничего не получилось, не сооброжу никак.
TrollXP (2003-12-07 07:03:00) [1]2 cyborg
Так ХР-шная винда же может воспроизводить MP3
2 Asteroid
А ты не мог бы линк дать на этот самый SDK,а то я никак найти не могу.
Asteroid (2003-12-06 10:28:00) [2]> fiction (05.12.03 21:30) [11]
Это подробно расписывалось в DirectSound SDK. Буфер кольцевой (при переходе через конец буфера указатели становятся в начало), так что RecPos, идущий после PlayPos, мог оказаться перед ним.
fiction (2003-12-05 21:30:00) [3]А вот я чё-то не понял насчёт RecPos и PlayPos. Почему первая меньше второй? Ведь позиция записи должна идти впереди позиции воспроизведения...и почему колво байт между ними больше размера буфера?
cyborg (2003-12-03 19:05:00) [4]MP3 никакой, он сторонних производителей.
zapped (2003-12-03 18:40:00) [5]2Тролль (03.12.03 16:07) [8]
насколько я знаю, у WinAmp`а свой плагин-декокодер MPEG (ну и не только)
Тролль (2003-12-03 16:07:00) [6]Вот тут, при осмыслении всего выше сказаного, возникло пара вопросов: если стоит абсолютно чистая винда, то какой кодек-то? и какой кодек исполюзует Винамп?
TrollXP (2003-12-02 07:06:00) [7]Понял (50 на 50 :)). Спасибо, потыкаю.
cyborg (2003-12-01 11:42:00) [8]Не забудь передвигать RecPos на позицию конца заполненных тобой байт.
cyborg (2003-12-01 11:31:00) [9]Во первых ищешь SDK нужного кодека с самим декодером.
Находиш функцию разпаковывания данных, незнаю как для MP3, для OGG нужно передавать адрес фиксированного буфера, размер делаешь по усмотрению.
Буфер можно объявить например массивом:
Buffer : array[1..4096] of byte;
С помощью функции декодера передаешь адрес этого буфера, она должна вернуть число декодированных байт, так, как может декодироваться и меньше байт, например, если это конец файла, и данных больше нет.
Затем смотришь, если декодировано байт больше нуля, то заполняеш буфер DirectSound-а. Перед этим нужно, естественно, создать сам этот буфер, обычно он потоковый, например я создаю буфер на 1 секунду проигрывания, чтобы успевать, если что, его заполнять.
При создании буфера ещё нужно создать переменную, указывающую позицию начала записи данных в буфер, например
RecPos : Cardinal;
Перед раскодирования данных в буфер (Buffer) нужно получить позиции текущего состояния указателей проигрывания и записи функцией
GetCurrentPosition(@PlayPosition, @WritePosition);
Затем блокируешь (Lock) данные между RecPos и PlayPos, смотришь, если кол-во байт между сохранённой позицией RecPos и PlayPosition больше или равно размера буфера (Buffer), то в цикле раскодируй очередные данные в буфер (Buffer) и заполняй данные от RecPos до PlayPosition, пока расстояне между ними не станет меньше размера буфера (Buffer);
Всё это декодирование и заполнение буфера помещай, например в мультимедиа таймер на 100-200 мс. при буфере в 1 секунду.
Вот, если понял мой бред ;).
Тролль (2003-12-01 08:30:00) [10]А ты не мог бы мне дать примерчик (ну, на будущее) по заполнению буфера.
cyborg (2003-11-29 13:10:00) [11]Я сделал библиотеку для проигрывания OGG файлов, это бесплатный формат и качество звука лучше при одинаковых битрейтах. Пока тестирую, для некоммерческих проектов будет бесплатно.
Вся трудность именно заключалась в заполнении буфера DirectSound, что наконец-то удалось :). Ирает без глюков и пирдежа.
Для МР3 читай какой нибудь SDK к кодеку, декодируй в буфер и из этого буфера заполняй буфер DirectSound.
Тролль (2003-11-29 06:33:00) [12]А кто-нить может подсказать, как засунуть mp3 файл в DirectSoundBuffer. Вроде разобрался, как его создать, описать и проиграть. А вот как засунуть в буф. не понял.
cyborg (2003-11-27 15:17:00) [13]Уже не нужно, сделал.