Вот только что удалось воспроизвести 5 секунд через OpenAL. Берём библиотеку
отсюда, там же SDK к ней, в SDK подробные примеры, даже есть готовая библиотека воспроизведения Ogg.
Удобная он-лайн помощь по API. Вот короткий кусок на ассемблере:
- Код: Выделить всё
....
cinvoke alcOpenDevice, 0 ;получаем хендл первого устройства (используется по умолчанию)
mov [MainDevice], eax
cinvoke alcCreateContext,[MainDevice], 0 ;создаем контекст устройства
mov [MainContext], eax
cinvoke alcMakeContextCurrent,[MainContext] ;делаем контекст текущим
cinvoke alGenBuffers, 1, FirstBuffer ;даем команду создать один буфер
cinvoke alGenSources, 1, FirstSource ;создаем один источник
<-->
здесь функция декодирования потока, данные пишутся в hStream
<-->
cinvoke alBufferData, [FirstBuffer], AL_FORMAT_STEREO16, [hStream], 4096*300, 44100 ;копируем загруженные данные в созданный буфер
cinvoke alSourcei,[FirstSource], AL_BUFFER, [FirstBuffer] ; //связываем наш источник с буфером
cinvoke alSourcePlay, [FirstSource] ;воспроизведение
....
Если что будет не понятно после чтения SDK, постараюсь помочь.
Добавлено спустя 20 часов 8 минут 46 секунд:В общем всё воспроизводится отлично, но только если декодировать файл целиком в буфер, и оттуда его проигрывать. Правильно же сделать декодирование по небольшим кусочкам, работать сразу с несколькими буферами, как это сделано во всех плеерах. Вот на создании этого цикла я пока застрял, а схема примерно следующая:
1. Создаются два или более буферов
2. В эти буфера по мере воспроизведения подгружаются данные и меняются местами, то есть проиграли один буфер, сразу же подставляем другой, что бы воспроизведение было плавным, без пауз и щелчков
3. Буфера то ли создаются каждый раз заново для новой порции данных, то ли просто сменяют друг друга. Здесь я не разобрался ещё
Нужно так же учитывать, что так-как битрейт переменный, то и размер декодированных данных (кадров) меняется. Поэтому скажем что бы заполнить буфер размером в 4096 байт, нужно произвести несколько чтений ov_read, и тут тоже встает вопрос о синхронизации. Само воспроизведение не представляет сложности, главное правильно организовать цикл с подгрузкой данных и сменой буферов, это и будет основной работой.