Con la funzione che segue eseguivo dei file wav in risposta ad eventi nella app. Il tutto funzionava egregiamente, ma dopo l'aggiornamento di Ubuntu a 19.10, non si sente più nulla, anche se la scheda audio funziona per suoni diversi da wav.
Public Sub Suona(nomeWav As String)
Dim err, channel As Integer
Dim audio_rate As Integer = 44100 ' Imposta la frequenza che verrà usata da "SDL_mixer"
Dim audio_buffers As Short = 4096 ' Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire i campioni audio
Dim fl, psound As Pointer
' Inizializza il dispositivo SDL audio:
err = SDL_Init(SDL_INIT_AUDIO)
If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL: " & SDL_GetError())
' Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:
err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
' Carica il file WAV:
fl = SDL_RWFromFile(VP.AppPath & "suoni/" & nomeWav, "rb")
If fl = 0 Then Error.Raise("Errore nel caricamento del file !")
psound = Mix_LoadWAV_RW(fl, 1)
' Esegue il file WAV caricato, ed intercetta il canale sul quale viene eseguito.
' Passando il valore -1 al primo argomento della funzione, il campione audio sarà eseguito sul primo canale audio disponibile:
channel = Mix_PlayChannelTimed(-1, psound, 0, 0)
If channel = -1 Then Error.Raise("Impossibile eseguire il file WAV: " & Mix_GetError())
' Attende che sia terminato il file WAV:
While Mix_Playing(channel) <> 0
Wait 0.01
Wend
' Libera la memoria precedentemente allocata per l'esecuzione sonora:
Mix_FreeChunk(psound)
' Chiude l'interfaccia audio SDL e SDL_mixer:
Mix_CloseAudio()
SDL_Quit()
End Sub
:ciao:
Se può servire:
ubuntu 19.04 con gb.sdl2.audio attivo, non ho problemi usando:
Dim sn As Sound
sn = Sound.load("fileaudio")
sn.play
:ciao:
con componente o che riga di codice lo richiamo?
Music.Load( percorso)
Music.Play
Vediamo un esempio per eseguire file audio di formato MP3 con la Classe Music del Componente gb.sdl2.audio e con l'ausilio della libreria esterna "libmpeg3":
Library "libmpeg3:2.1.8"
' mpeg3_t* mpeg3_open(char *path, int *error_return)
' Open the MPEG stream.
Private Extern mpeg3_open(path As String, error_return As Pointer) As Pointer
' long mpeg3_audio_samples(mpeg3_t *file, int stream)
Private Extern mpeg3_audio_samples(mpeg3file As Pointer, _stream As Integer) As Long
' int mpeg3_sample_rate(mpeg3_t *file, int stream)
Private Extern mpeg3_sample_rate(mpeg3file As Pointer, _stream As Integer) As Integer
' int mpeg3_close(mpeg3_t *file)
' Close the MPEG stream.
Private Extern mpeg3_close(mpeg3file As Pointer) As Integer
Public Sub Main()
Dim mp3 As Pointer
Dim perc As String
Dim camp As Long
Dim freq, i As Integer
Dim s As Single
Dim tmp As Date
perc = "/percorso/del/file.mp3"
mp3 = mpeg3_open(perc, 0)
camp = mpeg3_audio_samples(mp3, 0)
freq = mpeg3_sample_rate(mp3, 0)
s = camp / freq
Print "Durata: "; Date(0, 0, 0, 0, 0, 0, s * 1000)
Music.Load(perc)
Music.Play
tmp = Now
Repeat
i = DateDiff(tmp, Now, gb.Second)
Write "\rTempo trascorso: " & Date(0, 0, 0, 0, 0, 0, i * 1000)
Until i >= s
mpeg3_close(mp3)
End