Вело-изобретателиСтатьи

Декодирование музыкального формата OGG/Vorbis на VB6 (2 стр)

Автор:

Практическое использование.

Давайте подробнее рассмотрим, как использовать эту библиотеку. Выводить звук будем с помощью DirectX Sound8 через порт dx_vb.

Создадим новый проект, добавим в него модуль DirectX8 и классы DirectSound8, DirectSoundBuffer8.
В коде формы объявим и создадим интерфейсы DirectX Sound8, и наш класс для работы с OGG файлом:

Dim dxs  As New DirectSound8           'объект DirectSound8
Dim dxsb As New DirectSoundBuffer8     'буфер
Dim ogg  As New MXOggFile              'класс для работы с ogg файлом

При запуске программы инициализируем DirectX Sound8 и загрузим наш OGG файл:

   Set dxs = DirectX8.CreateDirectSound            'создаем устройство
   dxs.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL   'устанавливаем приоритет
   If LoadData = False Then Unload Me: End         'если загрузка не успешна выйдем

Теперь рассмотрим код загрузки файла:

Private Function LoadData() As Boolean
Dim PCM() As Byte               'PCM данные
Dim desc  As MX_OGG_DESC        'данные о файле
Dim Size  As Long               'размер PCM данных
Dim pos   As Long               'позиция считывания PCM данных
Dim res   As Long               'результат считывания

   If ogg.LoadOggFile(App.Path & "\media\intro.ogg") Then         'установим файл
      desc = ogg.GetDesc                  'получим данные о файле
      Size = ogg.TotalPCM * 4             'получим размер данных
                                          'создаем буфер
      Set dxsb = dxs.CreateSoundBuffer(desc.Channels, 16, desc.Rate, Size, DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_GETCURRENTPOSITION2)
      
      If Not dxsb Is Nothing Then
         ReDim PCM(Size)
         pos = 0
         
         Do While (pos < Size)                            'читаем до конца
            DoEvents
            res = ogg.ReadPCM(VarPtr(PCM(pos)), Size)     'читаем в буфер начиная с pos
            If res = 0 Then Exit Do                       'прочли все, выйдем
    
            If res < 0 Then                               'ошибка в потоке, выйдем
               LoadData = False
               Exit Function
            End If
         
            pos = pos + res                               'обновим позицию(в res количество прочитанных данных)
         Loop
      Else
         LoadData = False
         Exit Function
      End If
      
      If dxsb.SetData(0, Size, VarPtr(PCM(0))) Then       'загрузим в буфер
         LoadData = True
      Else
         LoadData = False
      End If
   Else
      LoadData = False
   End If
End Function

После успешной загрузки OGG файла мы должны получить данные о нем. Для этого воспользуемся двумя функциями нашего класса:
GetDesc() - получит структуру с описанием файла
TotalPCM() - получит размер PCM данных
Сама функция чтения PCM данных ReadPCM(BufPtr, Size) читает их с определенного адреса памяти. После загрузки файла этот адрес установлен в начало PCM блока. Его так же можно задать процедурой SeekPCM(pos). В функцию чтения передается размер считываемого PCM блока. Если же размер блока больше чем функция может прочитать, она прочитает только его часть, вернув размер прочитанного блока. Если функция вернет 0, значит файл прочитан до конца, если же значение <0, то это будет свидетельствовать о наличии ошибки в потоке OGG данных.

После окончания работы закроем файл и освободим все наши классы:

   ogg.CloseOggFile                                       'закроем файл
   Set ogg = Nothing                                      'выгрузим классы
   Set dxsb = Nothing
   Set dxs = Nothing

Пример с исходником на VB6 можно скачать тут: www.mx255.narod.ru/files/oggvb.rar
Спасибо за внимание!

Страницы: 1 2

#DirectX Sound, #OGG, #vb6

3 декабря 2011