Форум: "Media";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизСвоевременное заполнение DirectSoundBuffer-а Найти похожие ветки
← →
cyborg © (2003-11-26 18:40) [0]Задача стоит в своевременном заполнении буфера iDirectSoundBuffer, который постоянно проигрывается. Декодирую OGG файл в буфер, напимер 16 килобайт (размер без разницы), как мне в программе узнавать, что в буфер (DirectSoundBuffer) пора дописать новые данные?
Есть ли в DirectSoundBuffer какое нибудь событие, сообщающее, что пора заполнить буфер?
Сегодня безрезультатно целый день промучался :(.
Пытался воспользоваться функцией
GetCurrentPosition(@PlayPosition, @WritePosition);
только ничего не получилось, не сооброжу никак.
← →
cyborg © (2003-11-27 15:17) [1]Уже не нужно, сделал.
← →
Тролль (2003-11-29 06:33) [2]А кто-нить может подсказать, как засунуть mp3 файл в DirectSoundBuffer. Вроде разобрался, как его создать, описать и проиграть. А вот как засунуть в буф. не понял.
← →
cyborg © (2003-11-29 13:10) [3]Я сделал библиотеку для проигрывания OGG файлов, это бесплатный формат и качество звука лучше при одинаковых битрейтах. Пока тестирую, для некоммерческих проектов будет бесплатно.
Вся трудность именно заключалась в заполнении буфера DirectSound, что наконец-то удалось :). Ирает без глюков и пирдежа.
Для МР3 читай какой нибудь SDK к кодеку, декодируй в буфер и из этого буфера заполняй буфер DirectSound.
← →
Тролль (2003-12-01 08:30) [4]А ты не мог бы мне дать примерчик (ну, на будущее) по заполнению буфера.
← →
cyborg © (2003-12-01 11:31) [5]Во первых ищешь 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 секунду.
Вот, если понял мой бред ;).
← →
cyborg © (2003-12-01 11:42) [6]Не забудь передвигать RecPos на позицию конца заполненных тобой байт.
← →
TrollXP © (2003-12-02 07:06) [7]Понял (50 на 50 :)). Спасибо, потыкаю.
← →
Тролль (2003-12-03 16:07) [8]Вот тут, при осмыслении всего выше сказаного, возникло пара вопросов: если стоит абсолютно чистая винда, то какой кодек-то? и какой кодек исполюзует Винамп?
← →
zapped © (2003-12-03 18:40) [9]2Тролль (03.12.03 16:07) [8]
насколько я знаю, у WinAmp`а свой плагин-декокодер MPEG (ну и не только)
← →
cyborg © (2003-12-03 19:05) [10]MP3 никакой, он сторонних производителей.
← →
fiction (2003-12-05 21:30) [11]А вот я чё-то не понял насчёт RecPos и PlayPos. Почему первая меньше второй? Ведь позиция записи должна идти впереди позиции воспроизведения...и почему колво байт между ними больше размера буфера?
← →
Asteroid © (2003-12-06 10:28) [12]> fiction (05.12.03 21:30) [11]
Это подробно расписывалось в DirectSound SDK. Буфер кольцевой (при переходе через конец буфера указатели становятся в начало), так что RecPos, идущий после PlayPos, мог оказаться перед ним.
← →
TrollXP © (2003-12-07 07:03) [13]2 cyborg
Так ХР-шная винда же может воспроизводить MP3
2 Asteroid
А ты не мог бы линк дать на этот самый SDK,а то я никак найти не могу.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c