Декодирование музыкального формата OGG/Vorbis на VB6
Автор: Максим Лебедев
Введение.
Множество современных игр имеют звуковое сопровождение. Как известно звук в компьютере кодируется в формате PCM. Не будут же геймдевелоперы в своих играх хранить гигантские, несжатые звуковые файлы. :)
Существуют множество форматов сжатия аудиоданных, но, на мой взгляд, для игр - лучшим является OGG Vorbis.
Постановка задачи.
Декодирование OGG файлов в PCM данные и дальнейшая их обработка в IDE VB6.
Класс OGG файла.
Для декодирования OGG файлов будем использовать кодек: vorbis.dll, который идет в комплекте с ogg.dll (работа с контейнером) и vorbisfile.dll (работа с потоком). Так как все это добро не ориентировано для работы с VB6, было решено написать порт простенького класса для работы с OGG файлами на C++. Но как организовать работу с классом из VB6? Очень просто. :)
На стороне С++ мы создадим наш класс, выделив под него память (new), затем передадим указатель на него в VB:
myclass* create_myclass() { myclass* pClass; pClass = new myclass; return pClass; }
Теперь, имея лишь указатель, мы можем через специальные функции "переходники" работать с нашим классом:
long class_summ(myclass* pClass,int* a, int* b) { return pClass->summ( a,b); }
И в конце работы просто удалим класс:
void class_delete(myclass* pClass) { delete pClass; }
В этой статье не будет рассматриваться работа с библиотеками ogg, vorbis, vorbisfile. На сайте уже есть хорошая статья на этот счет.
Динамическая библиотека oggvb.
В результате изучения вышеприведенной статьи была написана библиотека oggvb.dll, содержащая экспортируемые процедуры и функции:
OggFile* create_ogg() long load_ogg_file( OggFile* pOggFile,char* FileName) long total_pcm( OggFile* pOggFile) void seek_pcm( OggFile* pOggFile,long pos) long read_pcm( OggFile* pOggFile,char* data, long size) void get_ogg_desc( OggFile* pOggFile,vorbis_info* pDesc) void close_ogg_file( OggFile* pOggFile) void delete_ogg( OggFile* pOggFile)
Можно заметить, как организованы функции "переходники" для класса OggFile. Но как же указатели? Как в VB6 прейдет указатель на OggFile? По сути, указатель - это обычная Long переменная, содержащая адрес компьютерной памяти. Так же в VB6 есть специальные ключевые слова, указывающие как передать аргумент функции:
ByVal - передать значение элемента.
ByRef - передать указатель на элемент.
Теперь создадим новый класс в VB6 и объявим в нем наши процедуры и функции: