Confermo il problema del blocco o comunque di una non fluidità del programma.
...San Midi (https://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) mi suggerisce di utilizzare il componente gb.openal al posto del componente gb.sdl2.audio:
http://www.gambas-it.org/wiki/index.php?title=La_gestione_dei_file_audio_mediante_il_componente_gb.openal
Ad esempio modificando parzialmente il tuo codice così:
'' Attivare il componente gb.openal !
Private ast As Alurestream
Private ica As Integer 'numero di carta scelata a caso nell'array bycarte
Private inuc As Integer 'numero di carte nell'array bycarte ridotto ad ogni scelta
Private sapppath As String 'variabile per il percorso dell'applicazione e dei suoi dati
Private bycarte As New String[] 'array di 10 carte
Public Sub Form_Open()
Dim i1 As Integer
Dim err As Boolean
sapppath = Application.Path
Me.Center
'carica array carte consecutive
For i1 = 0 To 10
bycarte.Add(i1)
Next
' Inizializza la libreria "Alure":
err = Alure.InitDevice(Null, Null)
If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
End
Public Sub Button1_Click()
Me.Close
End
Public Sub Button2_Click()
'mescola carte scambiandole 2 a 2
Dim obj1 As Object
Dim ix, ic1, ic2 As Integer
Dim ssalva1, ssalva2 As String
inuc = 10 '
For ix = 1 To 10
bycarte[ix] = ix
Next
Randomize
For ix = 1 To 10 Step 2
estraz 'estrazione di una carta a caso in ica
ic1 = ica
estraz 'estrazione di una carta a caso in ica
ic2 = ica
For Each obj1 In Me.Children
If obj1.Name = "pb" & Format(ic1, "00") Then
ssalva1 = obj1.Tag
Else
If obj1.Name = "pb" & Format(ic2, "00") Then
ssalva2 = obj1.Tag
Endif
Endif
Next
For Each obj1 In Me.Children
If obj1.Name = "pb" & Format(ic1, "00") Then
obj1.Visible = False
If CheckBox1.Value = True Then
emetti_suono
Wait 0.08
Else
Wait 0.1
Endif
obj1.Picture = Picture.Load(sapppath &/ ssalva2)
obj1.Visible = True
obj1.Tag = ssalva2
obj1.Refresh
Else
If obj1.Name = "pb" & Format(ic2, "00") Then
obj1.Visible = False
obj1.Picture = Picture.Load(sapppath &/ ssalva1)
obj1.Visible = True
obj1.Tag = ssalva1
obj1.Refresh
Endif
Endif
Next
Next
End
Public Sub Button3_Click()
emetti_suono
End
Public Sub Button4_Click()
'mescola carte scambiandole 2 a 2
Dim obj1 As Object
Dim ix, ic1, ic2 As Integer
Dim ssalva1, ssalva2 As String
'nascondi tutte le carte
For Each obj1 In Me.Children
If CheckBox1.Value = True Then
emetti_suono
Wait 0.009
Else
Wait 0.03
Endif
If Left(obj1.Name, 2) = "pb" Then
obj1.Visible = False
obj1.Refresh
Endif
Next
'scambia le carte due a due
inuc = 10 '
For ix = 1 To 10
bycarte[ix] = ix
Next
Randomize
For ix = 1 To 10 Step 2
estraz 'estrazione di una carta a caso in ica
ic1 = ica
estraz 'estrazione di una carta a caso in ica
ic2 = ica
For Each obj1 In Me.Children
If obj1.Name = "pb" & Format(ic1, "00") Then
ssalva1 = obj1.Tag
Else
If obj1.Name = "pb" & Format(ic2, "00") Then
ssalva2 = obj1.Tag
Endif
Endif
Next
For Each obj1 In Me.Children
If obj1.Name = "pb" & Format(ic1, "00") Then
obj1.Picture = Picture.Load(sapppath &/ ssalva2)
obj1.Tag = ssalva2
Else
If obj1.Name = "pb" & Format(ic2, "00") Then
obj1.Picture = Picture.Load(sapppath &/ ssalva1)
obj1.Tag = ssalva1
Endif
Endif
Next
Next
'visualizza tutte le carte
For Each obj1 In Me.Children
If Left(obj1.Name, 2) = "pb" Then
obj1.Visible = True
obj1.Refresh
Endif
Next
End
Public Sub estraz()
'ica = num. carta casuale, inuc = num. massimo carte in bycarte[]
'estrazione di una carta a caso in ica
Dim ix, izc As Integer
izc = Int(Rnd * inuc) + 1
ica = bycarte[izc] 'ica = numero di carta
For ix = izc To inuc - 1
bycarte[ix] = bycarte[ix + 1]
Next
inuc = inuc - 1
End
Public Sub emetti_suono()
Dim fileAudio As String = "molla.wav"
Dim src, lungh As Integer
Dim l As Byte = 1
src = Al.GenSources(1)[0]
' Individua la lunghezza del file audio caricato da eseguire:
lungh = Stat(fileAudio).Size
' Se il file audio è un "mp3" o un "ogg", allora il valore della variabile "lungh"
' deve essere moltiplicato almeno per 4, altrimenti l'esecuzione audio terminerà anticipatamente:
If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4
ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)
' Esegue il flusso di dati audio.
' Il terzo parametro della funzione rappresenta il numero dei buffer utilizzati da accodare alla fonte di "OpenAL".
' Ogni buffer verrà riempito con la lunghezza del "chunk" specificato quando il flusso è stato creato.
' Tale valore nell'esecuzione di un file audio deve essere di almeno 2.
Alure.PlaySourceStream(src, ast, 3, 0)
End
Public Sub CheckBox1_Click()
If CheckBox1.Value = False Then
CheckBox1.Text = "Silenzioso"
Else
CheckBox1.Text = "Rumoroso"
Endif
End
Caro vuott, come sempre, hai trovato la soluzione giusta al mio problema.
Non me, ma San Midi (...sempre sia lodato !) devi ringraziare.
Voglio solo dirti che all'avvio dell'applicazione mi esce questo strano errore a consolle:
"Error loading libdumb.so.1: libdumb.so.1: impossibile aprire il file oggetto condiviso: File o directory non esistente" che non influisce sul funzionamento.
Non so cos'è il "libdumb.so.1". Ne sai qualcosa?
Se non erro, mi compare anche sul mio portatile, però solo quando aggiorno Gambas.
Inoltre, quando si usa il CheckBox, escono 4 di questi messaggi:
"(gbx3:2825): Gtk-CRITICAL **: IA__gtk_widget_get_direction: assertion 'GTK_IS_WIDGET (widget)' failed"
Ti suggerisco di fare una ricerca su Google inserendo questa riga come chiave di ricerca. Magari anche aggiungendo la parola Gambas.
Infine, alla chiusura dell'applicazione, esce il messaggio:
"AL lib: ReleaseALC: 1 device not closed".
Si deve chiudere la libreria, precedentemente inizializzata.
Procedi così:
1) nella sub-routine emetti_suono() togli la variabile locale " src ", ed inseriscila all'inizio del codice come variabile Globale ( Private src As Integer );
2) modifica l'intera sub-routine " Sub Button1_Click() " come segue:
Public Sub Button1_Click()
Dim ii As New Integer[]
ii.Push(src)
If IsNull(ast) = False Then
Alure.DestroyStream(ast)
al.DeleteSources(ii)
Alure.StopSource(src)
Endif
Alure.ShutdownDevice()
Me.Close
End
Dopo la modifica il messaggio è cambiato. Ora è "AL lib: FreeContext: (0x1712460) Deleting 19 Source(s)", che sembra puramente informativo.
No, è un problema di chiusura del sorgente sonoro. Deve essere corretto.
Procedi così:
1) tra le variabili Globali elimina la dichiarazione " Private src As Integer ", ed aggiungi la seguente:
Private ii As New Integer[]
2) Modifica la sub-routine " Sub Button1_Click() " come segue:
Public Sub Button1_Click()
If IsNull(ast) = False Then
Alure.DestroyStream(ast)
al.DeleteSources(ii)
Alure.StopSource(ii[0])
Endif
Alure.ShutdownDevice()
Me.Close
End
3) Modifica la sub-routine " Sub emetti_suono() " come segue:
Public Sub emetti_suono()
Dim fileAudio As String = "molla.wav"
Dim lungh As Integer
Dim l As Byte = 1
If IsNull(ii) = False Then al.DeleteSources(ii)
ii = Al.GenSources(1)
' Individua la lunghezza del file audio caricato da eseguire:
lungh = Stat(fileAudio).Size
' Se il file audio è un "mp3" o un "ogg", allora il valore della variabile "lungh"
' deve essere moltiplicato almeno per 4, altrimenti l'esecuzione audio terminerà anticipatamente:
If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4
ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)
' Esegue il flusso di dati audio.
' Il terzo parametro della funzione rappresenta il numero dei buffer utilizzati da accodare alla fonte di "OpenAL".
' Ogni buffer verrà riempito con la lunghezza del "chunk" specificato quando il flusso è stato creato.
' Tale valore nell'esecuzione di un file audio deve essere di almeno 2.
Alure.PlaySourceStream(ii[0], ast, 3, 0)
End