Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.49 MB
Время: 0.037 c
3-1078648926
Дмитрий2004
2004-03-07 11:42
2004.04.04
Вопрос на счет значений поля в DBGrid


14-1078655373
Sniper-Max
2004-03-07 13:29
2004.04.04
Мышь - как руль с пидалями...


7-1074706015
Nick_Omsk
2004-01-21 20:26
2004.04.04
Как узнать поля принтера


7-1076403470
Димос
2004-02-10 11:57
2004.04.04
Очистка корзины


3-1078895672
Janbolat
2004-03-10 08:14
2004.04.04
BDE своими ручками





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский