Глава 12                                                                                                          к содержанию

Sound

На определенном этапе при программировании, вам может понадобиться звуки, которые играли в программе. Это может быть звуковым перезвон, который позволяет пользователю, что задача завершена, или это может быть звуковые эффекты в игре. Однако вы используете звук, вы должны знать, как загружать и воспроизводить звуковые файлы частности. В данной главе объясняется, как загружать различные различные звуковые файлы, и приводятся примеры о том, как играть эти звуковые файлы из программы.

#
Wave файл

Wave файлы один из наиболее распространенных форматов звука на персональных компьютерах, в связи с их создания объединить усилия между Microsoft и IBM . Wave  файлов, которые обычно имеют расширение файла *. WAV, являются родной формат звука используется всеми компьютерами. Хотя этот формат не имеет встроенной сжатия звуковых данных, это до сих пор используется для повседневных целей.

Следующий пример загружает звуковой файл называется Intro.wav и играет ее:


#SOUND_FILE = 1
 If InitSound()
    LoadSound(#SOUND_FILE, "Intro.wav")
    PlaySound(#SOUND_FILE)
    StartTime.l = ElapsedMilliseconds()
    Repeat
     Delay(1)
    Until ElapsedMilliseconds() > StartTime + 8000
 End
EndIf


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

После инициализации сделано и проверено мы загружаем звуковой файл, используя LoadSound() команды (Helpfile: Справочное руководство -> 2D игры Библиотеки -> Звук -> LoadSound). Эта функция загружает в память звуковой ждала нас, чтобы воспроизвести его. LoadSound() команда принимает два параметра, первый номер PB, которые вы хотите быть связано с этой звуковой файл, и второй это строка, содержащая имя файла звука, который вы хотите загрузить.

Когда звуковой файл был загружен вы можете играть в любое время в вашей программе, используя PlaySound()  команду (Helpfile: Справочное руководство->2D  Games  Libraries->Sound->PlaySound).
Эта команда имеет один параметр, который является число PB в звуковой файл, вы хотите играть.

Если вы внимательно посмотрите на пример файла волны вы увидите, я использовал довольно сложную петлю на конце программы. Это, чтобы остановить этот пример программы выхода слишком рано. При этом выход программы, все звуки, в настоящее время играет им будет остановиться и выгружается из памяти. Я не хочу, чтобы это произошло сразу, так что я закодированы этот цикл, чтобы дать программе 8 секунд, чтобы воспроизвести файл, а затем выйти. Вы, вероятно, никогда не увидите это в реальной программе, поскольку она, вероятно, основной цикл, чтобы сохранить программе живой , а звук проигрывается.

#

Вложенный Wave файл


Иногда в своих программах вы можете не загружать внешние файлы Wav, но файлы на самом деле содержится в вашей программе, с тем все это можно распространять в виде одного файла. Это может быть сделано путем внедрения вашей звуковой файл в DataSection, аналогичные вложения изображений, как описано в главе 9 (включая графику в программе). Существует одна разница однако, вместо CatchImage() команды, для загрузки файлов из DataSection, мы используем CatchSound() команду, вот пример:

#SOUND_FILE = 1
 If InitSound()

   CatchSound(#SOUND_FILE, ?SoundFile)
   PlaySound(#SOUND_FILE)
   StartTime.l = ElapsedMilliseconds()

   Repeat
     Delay(1)
    Until ElapsedMilliseconds() > StartTime + 8000
    End
 EndIf

DataSection
 SoundFile:
 IncludeBinary "Intro.wav"
EndDataSection


Звуковой файл внедрен в DataSection с помощью IncludeBinary команды точно так же, как и изображение, и метка звуковой волны файла знаменует начало файла в памяти. Чтобы загрузить этот звук из DataSection при запуске программы, мы используем CatchSound() команду
(Helpfile: Справочное руководство по-> 2D игры Библиотеки-> Звук->CatchSound).
Эта команда имеет два параметра, первый номер PB, который будут связан с этим звуком и второе, это адрес в памяти, где этот звук файл должен быть загружен. Этот адрес будет этикетке адрес, поскольку это означает, где звуковой файл в памяти. Чтобы получить адрес  используется знак вопроса напротив его названия, например ?SoundFile.  Мы получили пути Wav файла , вы можете использовать его, как и любой другой файл Wav, в данном случае, я играю звук с помощью PlaySound() команды. Многие Wav файлы могут быть внедрены в программу, нужно просто дать всем им уникальные идентификаторы.. 

#
Изменение звука в реальном времени


Использование звуковой команды в библиотеке звука PureBasic, можно сделать изменения громкости, звук баланса и скорость воспроизведения. Том увеличивает или уменьшает громкость звука, панорамирования означает переход звук из одного громкоговорителя в другой, как правило, с левой или правой и изменение частоты, по сути ускорить, замедлить  воспроизведение звукового файла во время воспроизведения . Для демонстрации этих эффектов, я создал программу небольшой звуковой проигрыватель, который использует изменение громкости, панорамирования и скорость воспроизведения. Попробуйте его, открыть, загрузить звуковой файл, нажмите клавишу воспроизведения и ручки трекбара.

Enumeration
  #WINDOW_ROOT
  #SOUND_FILE
  #TEXT_FILE
  #BUTTON_CHOOSE_FILE
  #TEXT_VOLUME
  #TRACKBAR_VOLUME
  #TEXT_PAN
  #TRACKBAR_PAN
  #TEXT_FREQUENCY
  #TRACKBAR_FREQUENCY
  #BUTTON_PLAY_FILE
  #BUTTON_STOP_FILE
EndEnumeration

Global FileName.s = ""

#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
If OpenWindow(#WINDOW_ROOT, 0, 0, 500, 250, "Sound Player", #FLAGS)
 If CreateGadgetList(WindowID(#WINDOW_ROOT))
  TextGadget(#TEXT_FILE, 10, 10, 480, 20, "", #PB_Text_Border)
  ButtonGadget(#BUTTON_CHOOSE_FILE, 10, 40, 150, 20, "Choose Wave File...")

  TextGadget(#TEXT_VOLUME, 10, 70, 480, 20, "Volume")
  TrackBarGadget(#TRACKBAR_VOLUME, 10, 90, 480, 20, 0, 100)
  SetGadgetState(#TRACKBAR_VOLUME, 100)

  TextGadget(#TEXT_PAN, 10, 120, 480, 20, "Pan")
  TrackBarGadget(#TRACKBAR_PAN, 10, 140, 480, 20, 0, 200)
  SetGadgetState(#TRACKBAR_PAN, 100)

  TextGadget(#TEXT_FREQUENCY, 10, 170, 480, 20, "Frequency")
  TrackBarGadget(#TRACKBAR_FREQUENCY, 10, 190, 480, 20, 100, 10000)
  SetGadgetState(#TRACKBAR_FREQUENCY, 4400)

  ButtonGadget(#BUTTON_PLAY_FILE, 10, 220, 100, 20, "Play File")
  ButtonGadget(#BUTTON_STOP_FILE, 130, 220, 100, 20, "Stop Sound")

  If InitSound()
   Repeat
   Event.l = WaitWindowEvent()
   Select Event
    Case #PB_Event_Gadget
     Select EventGadget()
      Case #BUTTON_CHOOSE_FILE
        FileName=OpenFileRequester("Choose","","Wave File (*.wav)|*.wav",0)
        If filename <> ""
          SetGadgetText(#TEXT_FILE, GetFilePart(FileName))
          LoadSound(#SOUND_FILE, filename)
        EndIf

      Case #TRACKBAR_VOLUME
        If filename <> ""
          SoundVolume(#SOUND_FILE, GetGadgetState(#TRACKBAR_VOLUME))
       EndIf

     Case #TRACKBAR_PAN
        If filename <> ""
          SoundPan(#SOUND_FILE, GetGadgetState(#TRACKBAR_PAN) - 100)
        EndIf

     Case #TRACKBAR_FREQUENCY
        If filename <> ""
          SoundFrequency(#SOUND_FILE,GetGadgetState(#TRACKBAR_FREQUENCY) * 10)
        EndIf

     Case #BUTTON_PLAY_FILE
        If filename <> ""
          PlaySound(#SOUND_FILE)
        EndIf

      Case #BUTTON_STOP_FILE
        If filename <> ""
          StopSound(#SOUND_FILE)
       EndIf
     EndSelect
    EndSelect
   Until Event = #PB_Event_CloseWindow
  EndIf
 EndIf
EndIf
End

 

Этот пример представляет три новые звуковые команды:

SoundVolume()
Эта команда используется для управления громкости загруженного звука. Это не меняет оригинальный звуковой файл в любом случае, она лишь меняет громкость звука, когда она воспроизводится. Для выполнения этой команды вы должны передать её двумя параметрами, первый номер PB от звука, который вы хотите изменить И второе: уровень громкости который вы хотите  изменить. Уровень громкости  - число в диапазоне от 0 и до 100% изменяет от 0 до максимальной громкости.

SoundPan()
Эта команда баланса звука  левого и правого каналов. Чтобы использовать эту команду нужно передать два параметра. Первый номер PB от звука, который вы хотите для панорамирования и вторым параметром является значение баланса. Это значение баланса число которых колеблется от -100 до 100. Если вы используете значение \-100, то звук полностью играет из левой колонки. Если вы используете значение 100, то звук полностью играет из правой колонки.

SoundFrequency()
Эта команда изменяет частоту звука для воспроизведения. Частота звуковой волны, измеряется в герцах и объясняется как количество колебаний в секунду. Например, вся музыка хранится на компакт-диске оцифровывается в размере 44,1 кГц (килогерц). Это означает, что сигнал содержащий звуковой информации на CD читается 44100 раз в секунду. Это необходимо в рамках резолюции для кодирования даже малейшего изменения звука. Если звук кодируется на 44,1 кГц, и вы используете эту команду, чтобы изменить свою частоту 22050 Гц, то, как только этот звук воспроизводится, она будет воспроизводить на половине скорости оригинала. Чтобы использовать эту команду в PureBasic Чтобы изменить частоту загруженных звук, вы передаете его двумя параметрами. Первый номер PB от звука, который вы хотите изменить и второй номер, который выражает новую частоту в Гц. Это второй параметр должен быть между 1000 и до 100000.

Чтобы узнать больше о командах, которые манипулируют файлов волны, см. звуковой библиотеки в файл помощи PureBasic
(Helpfile:Reference Manual->2D Games Libraries->Sound).

#

Модуль Файлы

Эти типы файлов используются форматы, что представляет музыку с использованием цифровых моделей. Внутри они хранят несколько страниц узорной музыки данных в форме, аналогичной, что и таблицы. Эти модели содержат сведения номера, номера инструмента и контроллера сообщения, которые говорят программа чтения файла, когда для воспроизведения нот, используя то, что образцы и как долго. Модуль файлов также проведет список, который определяет порядок, в котором Для воспроизведения модели.

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

Модуль файлы часто называют трекер модулем и искусство составления модулей называется слежения, просто потому, что первая программа, которая позволяет пользователям создавать модули было называется Soundtracker. Эта программа, хотя изначально плохо получил, был выпущен в общественное достояние, и был клонирован много раз лучше спортивных характеристик и разные названия, такие как Noisetracker или ProTracker , эти стали очень популярны особенно в Commodore Amiga игры и демо-создателей. Программы, которые могут создавать файлы модулей сегодня вместе известны как трекеры.

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

FastTracker (‘*.xm’)
Scream Tracker (‘*.s3m’)
Protracker(‘*.mod’)
Impulse Tracker (‘*.it’)

Эти различные типы модулей рассматриваются таким же образом, при погрузке и играть в вашей программе PureBasic. Вот пример, показывающий, как загружать и играть в любую из перечисленных выше типов модулей:

#MODULE_FILE = 1
 If InitSound()
  ;If InitModule()
   LoadModule(#MODULE_FILE, "Eighth.mod")
    PlayModule(#MODULE_FILE)
    StartTime.l = ElapsedMilliseconds()
    Repeat
      Delay(1)
    Until ElapsedMilliseconds() > StartTime + 15000
    StopModule(#MODULE_FILE)
   End
  ;EndIf
EndIf

Во-первых, нам необходимо инициализировать здоровой окружающей среды, как например волны файл с помощью InitSound() команды. Далее, нам необходимо инициализировать модуль возможности воспроизведения PureBasic используя функцию InitModule() команды. Обе эти команды должны быть проверены для обеспечения того, чтобы оба инициализируется правильно.

После того как среда создана можно загрузить модуль с помощью LoadModule() команды
(Helpfile: Справочное руководство по->2D игры Библиотеки-> модули-> LoadModule). Эта команда имеет два параметра, первый номер PB, что вы хотите, связаны с этим модулем И второе, это имя файла модуля должен быть загружен.

После его загрузки можно воспроизвести этот модуль в любое время, используя PlayModule() команды
(Helpfile: Справочное руководство по-> 2D игры Библиотеки-> модули->PlayModule).
Так же, как PlaySound() команду, на этот раз принимает один параметр, который является число PB модуля вы хотите играть.
Чтобы остановить модуль из игры вы можете использовать StopModule() команды.


Недостатки использования модулей

Есть две большие минусы использования модулей в своих программах PureBasic. Во-первых, не существует простой способ внедрения и загрузить из памяти все модули, которые должны быть воспроизведены. Это означает, что вы должны распространять все используемые файлы модулей вместе с исполняемым файлом. Существуют, однако, пути сохранения модуля в исполняемый файл и последующей записи на диск перед погрузкой и играть, но это немного громоздким. Второй недостаток в том, что вы должны распространять файл Midas11.dll вместе с вашей программой. Эта динамика связана библиотека загружается по команде InitModule() и будет ошибкой, если он не находит его. Вы можете думать, что это не так плох, но лицензии связанных с использованием этого Мидас библиотеке запрещает использовать его в коммерческих целях.
Эта лицензия также запрещает Midas11.dll файлы, который включен в пакет PureBasic, поэтому вам придется скачать ее для себя от Audio System веб-сайт Housemarque.

Чтобы узнать о других команд, которые могут использоваться для управления файлами модуля, см. модуль библиотеки в файл помощи PureBasic
(Helpfile:Reference Manual->2D Games Libraries->Module).


Mp3

MP3 файлы быстро становится самой популярной звуковой формат всех времен, в основном благодаря тому, что формат MP3 является стандартом де-факто для практически всех скачиваемой музыки в Интернете.

MP3 файлы обрабатываются немного по-разному в PureBasic А для того, Чтобы играть в них мы должны использовать команды из библиотеки  ‘Movie’ library (Helpfile:Reference Manual->General Libraries->Movie).
Это может показаться немного странным, использование видео команд проигрывать MP3-файлы, но видео команды способны гораздо больше, чем просто воспроизведение фильмов. Видео библиотека предоставляет удобный способ для загрузки и играть почти во всех средствах массовой информации, которые кодек, установленный на компьютере. Вы можете не только играть видео форматы с помощью этих команд, но вы можете также воспроизводить аудио форматы.

Вот список наиболее популярных форматов файлов, которые библиотека видео может играть, В зависимости от установленных кодеков Вы можете даже играть больше форматов, чем это показано в этом списке:

Movie Files:
     Audio Video Interleave (‘*.avi’)
     MPEG Video (‘*.mpg’)

Audio Files:
    Midi Files (‘*.mid’)
    MP3 Files (‘*.mp3’)
    Ogg Vorbis (‘*.ogg’)
    Wave Files (‘*.wav’)

Может показаться, что Библиотека Видео , подойдёт для всех ваших потребностей играть аудио и видео. И некоторые люди даже попросил, чтобы она была переименована в библиотеку Media, но  надо помнить одну вещь , что если что-то  и играет на компьютере, оно может не загружается и не играть на компьютере  другого человека. Это потому, что могут быть различные плагины или кодеки установлены, (или нет) на других компьютерах. Однако, приведенный выше список, как представляется, довольно стандартным для большинства машин.

В следующем примере я использовал видео команды, чтобы создать простой MP3-плеер и обеспечить простой том, и пан контроля. Она не может соперничать WinAmp, но это дает вам представление о том, как легко медиаплееры создать в PureBasic.

Enumeration
  #WINDOW_ROOT
  #SOUND_FILE
  #TEXT_FILE
  #BUTTON_CHOOSE_FILE
  #TEXT_VOLUME
  #TRACKBAR_VOLUME
  #TEXT_PAN
  #TRACKBAR_PAN
  #BUTTON_PLAY_FILE
  #BUTTON_PAUSE_FILE
  #BUTTON_STOP_FILE
EndEnumeration

Global FileName.s = ""
Global FilePaused.b = #False
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#WINDOW_ROOT, 0, 0, 500, 215, "MP3 Player", #FLAGS)
 If CreateGadgetList(WindowID(#WINDOW_ROOT))
  TextGadget(#TEXT_FILE, 10, 10, 480, 20, "", #PB_Text_Border)

  ButtonGadget(#BUTTON_CHOOSE_FILE, 10, 40, 150, 20, "Choose MP3 File...")
  TextGadget(#TEXT_VOLUME, 10, 70, 480, 20, "Volume")
  TrackBarGadget(#TRACKBAR_VOLUME, 10, 90, 480, 20, 0, 100)
  SetGadgetState(#TRACKBAR_VOLUME, 100)

  TextGadget(#TEXT_PAN, 10, 120, 480, 20, "Pan")
  TrackBarGadget(#TRACKBAR_PAN, 10, 140, 480, 20, 0, 200)
  SetGadgetState(#TRACKBAR_PAN, 100)

  ButtonGadget(#BUTTON_PLAY_FILE, 10, 180, 100, 20, "Play")
  ButtonGadget(#BUTTON_PAUSE_FILE, 130, 180, 100, 20, "Pause")
  ButtonGadget(#BUTTON_STOP_FILE, 250, 180, 100, 20, "Stop")

   If InitMovie()
    Repeat
     Event.l = WaitWindowEvent()
      Select Event
       Case #PB_Event_Gadget
        Select EventGadget()

         Case #BUTTON_CHOOSE_FILE
          FileName=OpenFileRequester("Choose","","MP3 File (*.mp3)|*.mp3",0)
           If filename <> ""
            SetGadgetText(#TEXT_FILE, GetFilePart(FileName))
            LoadMovie(#SOUND_FILE, filename)
           EndIf

         Case #TRACKBAR_VOLUME, #TRACKBAR_PAN
          If filename <> ""
           Volume.l = GetGadgetState(#TRACKBAR_VOLUME)
           Balance.l = GetGadgetState(#TRACKBAR_PAN) - 100
           MovieAudio(#SOUND_FILE, Volume, Balance)
          EndIf

         Case #BUTTON_PLAY_FILE
          If filename <> ""
           PlayMovie(#SOUND_FILE, #Null)
           FilePaused = #False
           SetGadgetText(#BUTTON_PAUSE_FILE, "Pause")
          EndIf

         Case #BUTTON_PAUSE_FILE
          If filename <> ""
           If FilePaused = #False
            PauseMovie(#SOUND_FILE)
            FilePaused = #True
            SetGadgetText(#BUTTON_PAUSE_FILE, "Resume")
           Else
            ResumeMovie(#SOUND_FILE)
            FilePaused = #False
            SetGadgetText(#BUTTON_PAUSE_FILE, "Pause")
           EndIf
          EndIf

         Case #BUTTON_STOP_FILE
          If filename <> ""
           StopMovie(#SOUND_FILE)
           FilePaused = #False
           SetGadgetText(#BUTTON_PAUSE_FILE, "Pause")
          EndIf
        EndSelect
       EndSelect
     Until Event = #PB_Event_CloseWindow
   EndIf
 EndIf
EndIf
End

Глядя на этот небольшой пример, вы можете увидеть, что для использования команды видео, вы должны инициализировать природной среды, как волны файлов и модулей. Для инициализации фильм используемые вами команды InitMovie() команды. После этого был назван Вы можете использовать другие команды библиотеки видео. Как и другие команды инициализации она должна быть проверена и, если он сломается, вы не сможете продолжать использовать фильм команд.

Для загрузки видео (или в данном случае MP3-файл) мы используем LoadMovie() команды
(Helpfile: Справочное руководство по-> Общие библиотеки-> Movie-> LoadMovie). Эта команда имеет два параметра. Первый номер PB, что вы хотите, связанных с СМИ о загружать и вторым параметром является строка, содержащая имя файла реальных средах для загрузки файлов.

После того как средства массовой информации был загружен мы можем воспроизвести его при помощи оператора PlayMovie() команды
(Helpfile: Справочное руководство по->Общие библиотеки-> Movie-> PlayMovie).
Эта команда имеет два параметра, чтобы иметь возможность поддерживать фильмы, а также аудио информации. Первым параметром является номер PB средств массовой информации вы хотите играть, а второй параметр является идентификатором OS из окна. Этот идентификатор ОС При воспроизведении фильма, потому что это окно, где кино показывать будут оказаны. Если вы воспроизведения файла, который состоит только аудио-данных (например, MP3), то вы можете использовать встроенные в постоянном #Null Как идентификатор OS, это не затем связать любое окно в воспроизведении файл:

   ...
   PlayMovie(#SOUND_FILE, #Null)
   ...

Кроме того, в примере я использовал PauseMovie() и ResumeMovie() команды, они просты в использовании, они оба принимают один параметр, который PB количество средств массовой информации вы хотите, чтобы приостановить или возобновить.

Чтобы вы могли остановить воспроизведение файлов, я также использовал StopMovie() команды в этом примере. Опять же, это просто один использовать, как вам нужно всего лишь передать его одному параметру. Это число PB средств массовой информации вы хотите остановить воспроизведение.

Даже если это скелет медиа плеер и он поддерживает только MP3, было бы тривиальная задача, чтобы перевести этот код, чтобы сделать свой собственный медиа-проигрыватель способный решать все из перечисленных форматов. Почему бы вам не попробовать?

CD Audio

Воспроизведение аудио CD является хорошим способом обеспечить высокое качество музыки Для любой игры или приложения, которые необходимо музыки. Есть много инструментов, доступных в Интернете, для создания и записи своего музыку на CD. Использование CD Предоставлять музыка это замечательная идея, потому что играть в них требует очень мало системных ресурсов и качества является фантастической.

Вот пример, который использует AudioCD библиотека PureBasic, чтобы создать очень простой проигрыватель компакт-дисков:

Enumeration
  #WINDOW_ROOT
  #BUTTON_PREVIOUS
  #BUTTON_PLAY
  #BUTTON_STOP
  #BUTTON_NEXT
  #BUTTON_EJECT
  #TEXT_STATUS
  #PROGRESS_SONG
  #LIST_TRACKS
EndEnumeration

;Global variables, etc.
Global NumberOfTracks.l
Global CurrentTrack.l
;Convert seconds into a String containing minutes
Procedure.s ConvertToMin(Seconds.l)
 ProcedureReturn Str(Seconds / 60) + ":" + Str(Seconds % 60)
EndProcedure
;Set the current track
Procedure UpdateStatusText(Track.l)
 If NumberOfTracks > 0
  TrackLength.l = AudioCDTrackLength(Track)
  TrackLengthString.s = ConvertToMin(TrackLength)
  TrackTimings.s = " (" + TrackLengthString + ")"
  SetGadgetText(#TEXT_STATUS, "Track: " + Str(Track) + TrackTimings)
  SetGadgetState(#PROGRESS_SONG, 0)
    If AudioCDStatus() > 0
     TimeElapsed.l = AudioCDTrackSeconds()
     TrackTimings.s=" ("+ConvertToMin(TimeElapsed)+" / "+TrackLengthString+")"
     SetGadgetText(#TEXT_STATUS, "Track: " + Str(Track) + TrackTimings)
     Progress.f = (100 / TrackLength) * TimeElapsed
     SetGadgetState(#PROGRESS_SONG, Progress)
    EndIf
   SetGadgetState(#LIST_TRACKS, Track - 1)
  Else
   SetGadgetText(#TEXT_STATUS, "Please insert an Audio CD")
 EndIf
EndProcedure

;Move to next track
Procedure NextTrack()
 If CurrentTrack < NumberOfTracks
   CurrentTrack + 1
   UpdateStatusText(CurrentTrack)
     If AudioCDStatus() > 0
       PlayAudioCD(CurrentTrack, NumberOfTracks)
    EndIf
 EndIf
EndProcedure

;Move to previous track
Procedure PreviousTrack()
  If CurrentTrack > 1
   CurrentTrack - 1
   UpdateStatusText(CurrentTrack)
    If AudioCDStatus() > 0
      PlayAudioCD(CurrentTrack, NumberOfTracks)
   EndIf
 EndIf
EndProcedure

;Populate the list to show all tracks on a disc
Procedure PopulateTrackListing()
 ClearGadgetItemList(#LIST_TRACKS)
 NumberOfTracks = AudioCDTracks()
  If NumberOfTracks > 0
   For x.l = 1 To NumberOfTracks
   TrackLength.s = ConvertToMin(AudioCDTrackLength(x))
   AddGadgetItem(#LIST_TRACKS, -1, "Track "+Str(x)+" ("+TrackLength+")")
    Next x
    If CurrentTrack = 0
      CurrentTrack = 1
    EndIf
  Else
   CurrentTrack = 0
  EndIf
EndProcedure

#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered

If OpenWindow(#WINDOW_ROOT, 0, 0, 320, 250, "CD Player", #FLAGS)
If CreateGadgetList(WindowID(#WINDOW_ROOT))
ButtonGadget(#BUTTON_PREVIOUS, 10, 10, 60, 20, "Previous")
ButtonGadget(#BUTTON_PLAY, 70, 10, 60, 20, "Play")
ButtonGadget(#BUTTON_STOP, 130, 10, 60, 20, "Stop")
ButtonGadget(#BUTTON_NEXT, 190, 10, 60, 20, "Next")
ButtonGadget(#BUTTON_EJECT, 250, 10, 60, 20, "Eject")
TextGadget(#TEXT_STATUS, 10, 40, 300, 20, "", #PB_Text_Center)
ProgressBarGadget(#PROGRESS_SONG,10,65,300,10,0,100,#PB_ProgressBar_Smooth)
ListViewGadget(#LIST_TRACKS, 10, 90, 300, 150)

If InitAudioCD()
  PopulateTrackListing()
  StartTime.l = ElapsedMilliseconds()
Repeat
 Event.l = WindowEvent()
  Select Event
   Case #PB_Event_Gadget
    Select EventGadget()
     Case #BUTTON_PREVIOUS
       PreviousTrack()
     Case #BUTTON_PLAY
      If NumberOfTracks > 0
        PlayAudioCD(CurrentTrack, NumberOfTracks)
      EndIf
     Case #BUTTON_STOP
       StopAudioCD()
     Case #BUTTON_NEXT
       NextTrack()
     Case #BUTTON_EJECT
       EjectAudioCD(#True)
       PopulateTrackListing()
     Case #LIST_TRACKS
      If EventType() = #PB_EventType_LeftDoubleClick
        CurrentTrack = GetGadgetState(#LIST_TRACKS) + 1
        UpdateStatusText(CurrentTrack)
        PlayAudioCD(CurrentTrack, NumberOfTracks)
      EndIf
    EndSelect
  EndSelect

CurrentTime.l = ElapsedMilliseconds()
  If CurrentTime > StartTime + 1000
    PopulateTrackListing()
    UpdateStatusText(CurrentTrack)
    StartTime.l = ElapsedMilliseconds()
  EndIf
   Delay(1)
Until Event = #PB_Event_CloseWindow
 StopAudioCD()
EndIf
EndIf
EndIf
End

Этот пример очень простой CD-плеер, который обеспечивает минимум функций по контролю и воспроизведению по списку. О бо всей AudioCD библиотеке команд, которые могут быть использованы, читайте более подробно в файле помощи PureBasic
(Helpfile: Справочное руководство по-> Общие библиотеки-> AudioCD).

Чтобы использовать AudioCD команды для начала вы должны инициализировать необходимые ресурсы, чтобы иметь возможность играть CD. Для этого мы используем InitAudioCD () команды.
Эта команда должна быть проверена, чтобы определить, если она была успешной или нет.
Заодно Возвращаемое значение этой команды является количество CD дисков, подключенных к компьютеру и из которых доступны для использования в целях воспроизведения музыки. Если возвращаемое значение равно 0, значит компьютер либо не имеет CD привода или еще одна проблема была выявлена, который препятствует работе компакт-дисков с музыкой. 
Если возвращаемое значение выше 0,то все должно быть хорошо.


После того как аудио CD была инициализирована, вы можете использовать все другие команды, доступные в AudioCD библиотеке...

Вот список тех команд, которые я использовал в своем примере проигрыватель компакт-дисков:

PlayAudioCD()
Эта команда используется для воспроизведения трека на текущем CD, который вставляется в дисковод. Эта команда имеет два параметра. Первый трек Чтобы начать игру. А второй трек для остановки воспроизведения после окончания. Так, например, если я назвал команду наподобие следующей:

       PlayAudioCD(1, 3)

Трек 1 начнет игру, а затем продолжить играть трек 2 и далее. Остановить после проигрывания трека 3.

StopAudioCD()
Эта команда может быть использован  для остановки воспроизведение любого трека компакт-диска.

EjectAudioCD()
Эта команда откроет или закроет лоток на CD диске в зависимости от того, какой параметр передается ей. Эта команда принимает только один параметр, и если это параметр 1 лоток привода откроется,  остановка воспроизведения и извлечения CD.
Если параметр 0 привод лоток закроется, загрузкой CD, который помещен в нем.

AudioCDStatus()
Эта команда не имеет параметров, но возвращает результат, который дает в реальном времени статус CD в приводе. Если вы вызываете эту команду и возвращает 1, то диск не готов, это означает, что диск не содержит ни CD или что лоток дисковода в настоящее время закрыт. Если эта команда возвращает значение 0 , значит CD был обнаружен правильно и находится в приводе CD, но не играет. Если эта команда возвращает значение, которое выше 0, значит компакт-дисков играет CD дорожки. Число, которое было фактически вернулись, это трек номер, который воспроизводится

AudioCDTracks()
Эта команда не принимает никаких параметров и при вызове, возвращает количество треков на CD загружается, которые доступны для воспроизведения.

AudioCDTrackLength()
Эта команда требует один параметр И это номер трека из загруженного диска. Имея эту информацию, команда вернет длину дорожки в секундах.

AudioCDTrackSeconds()
Эта команда не принимает никаких параметров. При вызове, она вернет количество времени, в секундах с начала проигрывания трека CD.

Если вы посмотрите внимательнее к моему примеру проигрыватель компакт-дисков, я использовал команду WindowEvent ()  вместо  WaitWindowEvent (). Это означает, что основной цикл будет работать всегда, независимо от обнаружено событие или нет. Мне нужна чтобы программа делала  обновления статуса текста и графического пользовательского интерфейса CD. Если бы я не использовать эту команду, статус текст будет обновляться только если событие было обнаружено, что может быть или нет.


WindowEvent () и WaitWindowEvent () - более подробно описаны в главе 9 (Понимание Events).

#

PureBasic форум            http://purebasic.info/phpBB2/
Визуальный редактор     Visual web











Используются технологии uCoz