PureBasic

;
; ------------------------------------------------------------
;
;  PureBasic - Audio CD example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

NbCDDrives = InitAudioCD()

If NbCDDrives = 0
    MessageRequester("Ошибка", "Аудио CD-дисков не найдено...", 0)
    End
EndIf

Global Null$

Procedure.s GetHourFormat(LengthInSeconds)
    Minutes = LengthInSeconds/60
    Seconds = LengthInSeconds-Minutes*60
    If Seconds < 10 : Null$ = "0" : Else : Null$ = "" : EndIf

    ProcedureReturn Str(Minutes)+":"+Null$+Str(Seconds)
EndProcedure

; Инициализация констант для упрощения чтения кода
;
#GADGET_Play  = 0
#GADGET_Stop  = 1
#GADGET_Eject  = 2
#GADGET_Close  = 3
#GADGET_Select = 4
#GADGET_Status = 5
#GADGET_Time  = 6
#GADGET_AudioCDDrive = 7
#GADGET_SelectDrive  = 8

Procedure RefreshCD()
    ClearGadgetItems(#GADGET_Select)

    NbAudioTracks = AudioCDTracks()
    For k=1 To NbAudioTracks
        AddGadgetItem(#GADGET_Select, -1, "Трэк "+Str(k))
    Next
    SetGadgetState(#GADGET_Select, 0)
EndProcedure


If OpenWindow(0, 100, 200, 265, 125, "PureBasic - Пример AudioCD", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ButtonGadget  (#GADGET_Play  ,  10, 10, 60 , 24, "Воспр.")
    ButtonGadget  (#GADGET_Stop  ,  70, 10, 60 , 24, "Стоп")
    ButtonGadget  (#GADGET_Eject  , 130, 10, 60 , 24, "Изъять")
    ButtonGadget  (#GADGET_Close  , 190, 10, 60 , 24, "Закрыть")
    ComboBoxGadget(#GADGET_Select ,  10, 43, 240, 24)
    TextGadget(#GADGET_Status, 10, 70, 180, 24, "Статус: Остановлено")
    TextGadget(#GADGET_Time, 200, 70, 240, 24, "")

    TextGadget(#GADGET_AudioCDDrive, 10, 99, 180, 24, "Выберите привод CD-Audio:")
    ComboBoxGadget(#GADGET_SelectDrive, 210, 95, 40, 24)

    For k=1 To NbCDDrives
        UseAudioCD(k-1)
        AddGadgetItem(#GADGET_SelectDrive, -1, Left(AudioCDName(),2))
    Next
    SetGadgetState(#GADGET_SelectDrive, 0)
    UseAudioCD(0)

    If NbCDDrives = 1
        DisableGadget(#GADGET_SelectDrive, 1)
    EndIf

    RefreshCD()

    Repeat
        Repeat
            Event = WindowEvent()  ; На этот раз мы используем неблокирующую команду WindowEvent (), чтобы обновить время

            If Event = #PB_Event_Gadget
                Select EventGadget()

                    Case #GADGET_Play
                        CurrentTrack = GetGadgetState(4)+1
                        PlayAudioCD(CurrentTrack, CurrentTrack)

                    Case #GADGET_Stop
                        StopAudioCD()

                    Case #GADGET_Eject
                        EjectAudioCD(1)

                    Case #GADGET_Close
                        EjectAudioCD(0)

                    Case #GADGET_SelectDrive
                        UseAudioCD(GetGadgetState(#GADGET_SelectDrive))
                        RefreshCD()

                EndSelect

            Else
                If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
            EndIf
        Until Event = 0

        Delay(20) ; Подождите 20 мс, что является длительным периодом для процессора, чтобы не красть всю мощность процессора
                  ; в многозадачных средах, для нашего маленького приложения :)

        CurrentTrack = AudioCDStatus()
        If CurrentTrack > 0
            SetGadgetText(#GADGET_Status, "Playing Track "+Str(CurrentTrack)+" (Length: "+GetHourFormat(AudioCDTrackLength(CurrentTrack))+")")
            SetGadgetText(#GADGET_Time, "Время: "+GetHourFormat(AudioCDTrackSeconds()))
            DisableGadget(#GADGET_Play, 1)
            DisableGadget(#GADGET_Stop, 0)
            DisableGadget(#GADGET_Select, 0)
        Else
            SetGadgetText(#GADGET_Status, "Статус: Остановлено")
            SetGadgetText(#GADGET_Time, "")
            DisableGadget(#GADGET_Play, 0)
            DisableGadget(#GADGET_Stop, 1)

            If CurrentTrack = -1 ; CD Привод не готов
                DisableGadget(#GADGET_Select, 1)
            Else
                DisableGadget(#GADGET_Select, 0)
            EndIf
        EndIf

    Until Quit = 1

EndIf

For k=0 To NbCDDrives-1    ; Остановите все CD-приводы, если некоторые из них играют вместе
    UseAudioCD(k)
    StopAudioCD()
Next

End