Программирование звука под Windows

Список разделов Ogg Vorbis Тех-поддержка

Описание: Инструменты, кодеки, сопроводительная информация, алгоритмы, программирование.

Сообщение #1 development » 09.06.2007, 12:28

Предлагаю в этой теме обсуждать всё, что касается программирования звука (в играх, в проигрывателях, конвертерах, виртуальных музыкальных инструментах и т.д.)
development
Репутация: 0
С нами: 16 лет 9 месяцев

Сообщение #2 development » 09.06.2007, 13:41

В данный момент бьюсь над задачей (работаю на Visual C++ 2005):

Нужно сделать так, чтобы вызов ogg-vorbis библиотечной функции ov_open, которая открывает файловый указатель на уже открытый ogg-файл была заменена другой функцией (скорее всего ov_open_callbacks(datasource, &vf, NULL, fileSize/* или обычно 0 */, callbacks)), где datasource является void* указателем очевидно на начало копии ogg-файла в памяти.

Код: Выделить всё
FILE *f = fopen(filename, "rb");
ov_open(f, &vf, NULL, 0); // вместо вызова этой функции пытаюсьov_open_callbacks(fileImagePointer, &vf, NULL, fileSize/* или обычно 0 */, callbacks); // пытаюсь воспользоваться этой ф-ей
.

Такая необходимость возникла из-за требования работать не с файловым указателем f (так как у пользователей программы не будут размещены ogg-файлы в явном виде), а с указателем на двоичную копию файла в оперативной памяти (так как все звуковые и некоторые иные файлы будут запакованы в виде сплошного монолитного файла, из недр которого звуковой ogg-файл будет скопирован в нужный момент в оперативную память, после чего указатель на начало этой копии файла будет известен).

Создать бинарную копию файла в оперативную память удаётся легко, но вот попытки воспользоваться указателем на начало этой копии не увенчались пока успехом.

Надеюсь, что может кто-нибудь когда-нибудь сталкивался с подобной проблемой и вдруг даст ценный намёк, где что поискать. В поисковиках пока на русском языке ничего не нашёл. В оригинальной англо-язычной документации (из библиотечных архивов ogg-vorbis) тоже не нашёл примеров кода для случая работы с копиями ogg-файлов в памяти.

Немного более обобщённый вопрос: можно ли использовать в Си-функциях файлового ввода/вывода вместо указателя на файл (типа FILE*) void* указателем на начало двоичной копии этого файла? Явно у меня это не получается. Приведения void* указателя к типу FILE* приводят к ошибкам во время исполнения.

Значит функции файлового ввода/вывода каким-то образом небезразличны к тому, откуда они черпают совершенно идентичные нули и единицы, из дисков или из оперативки...

Удалось пока сделать немного хитро-криво. Пришлось создавать на несколько миллисекунд ogg-файл, забрасывать в него всё бинарное содержимое из копии оригинального ogg-файла в памяти. После этого удаётся успешно воспользоваться функциями ogg-vorbis библиотек, и смело удалять временный файл. Как сырой вариант исправно работающего класса я думаю на первое время пойдёт.
development
Репутация: 0
С нами: 16 лет 9 месяцев

Сообщение #3 development » 09.06.2007, 13:53

Хотелось бы найти примеры исходников, как разворачивать OGG-файл в PCM-данные не сразу все, а с постепенным добавлением в участки вторичного DirectSound буфера (многопоточное Win32 или MFC приложение, в котором один поток играет звук из одного участка буфера, а другой поток заполняет другой участок буфера новыми PCM-данными из разворачиваемого на ходу OGG-файла).
development
Репутация: 0
С нами: 16 лет 9 месяцев

Сообщение #4 development » 10.06.2007, 23:13

Задача с использованием памяти вместо файла успешно решена с помощью интересного материала с исходниками в архиве на http://www.devmaster.net/articles/openal-ogg-file/
development
Репутация: 0
С нами: 16 лет 9 месяцев

ActiveX

Сообщение #5 zlobec » 28.11.2007, 10:53

Не подскажет ли кто,есть ли готовый ActiveX для воспроизведения Ogg?
zlobec
Репутация: 0
С нами: 16 лет 4 месяца

Сообщение #6 development » 28.11.2007, 11:01

Я ни разу не встречал такого компонента, хотя рылся в поисковиках ища ответ на свои прежние вопросы.
development
Репутация: 0
С нами: 16 лет 9 месяцев


Вернуться в Тех-поддержка



cron