Autore Topic: [RISOLTO (cambiando libreria)] suoni prodotti con sdl2.audio  (Letto 723 volte)

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Salve. Volendo realizzare un solitario con carte da gioco ho usato alcuni suoni in forma di file .wav trovati in Internet. Mi sono accorto che, in certi casi, l'emissione di questi suoni provoca un blocco dell'applicazione, soprattutto nei loop in cui le carte dovrebbero muoversi accompagnate da rumori adatti. Poi ho capito che dovevo dare un po' di tempo all'emissione del suono: in genere basta un Wait 0.3 per questo tipo di suoni molto brevi. Certo, sono brevi, ma non tanto da seguire passo passo il movimento delle carte. Il risultato, non accettabile, è che si sentono prima un po' di rumori, poi si vede il movimento delle carte, mentre continuano i rumori.
Il rimedio potrebbe essere usare suoni di una brevità che non riesco a immaginare e non so dove trovare.
Un altro rimedio, se fosse possibile, sarebbe accorciare alcuni di quelli che ho.
Comunque ho prodotto un piccolo progetto dimostrativo che potrei inserire qui, se qualcuno fosse interessato.
Grazie.
« Ultima modifica: 04 Agosto 2015, 18:26:12 da Cocirio »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #1 il: 31 Luglio 2015, 23:09:12 »
Qui siamo nel campo d'azione del nostro ESIMIO MUSICISTA Vuott, il quale saprà sicuramente aiutarti, con la benedizione di  sanmidi, quindi posta pure. :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #2 il: 01 Agosto 2015, 08:18:10 »
Ok. Vi passo il pacchetto .gz, così avrete i suoni e 10 carte.
Ciao

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #3 il: 01 Agosto 2015, 16:55:43 »
Confermo il problema del blocco o comunque di una non fluidità del programma.

...San Midi 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ì:
Codice: gambas [Seleziona]
'' 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
« Ultima modifica: 31 Agosto 2016, 17:14:42 da Gianluigi »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #4 il: 01 Agosto 2015, 23:12:35 »
Caro vuott, come sempre, hai trovato la soluzione giusta al mio problema.
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?
Inoltre, anche prima del tuo intervento, 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"
Infine, alla chiusura dell'applicazione, esce il messaggio:
"AL lib: ReleaseALC: 1 device not closed".
In ogni caso sono pronto ad inserire l'uso del gb.openal nel solitario che, tra parentesi, è molto carino (almeno a me piace). Grazie.
Ciao

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #5 il: 02 Agosto 2015, 00:34:19 »
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:
Codice: gambas [Seleziona]
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

« Ultima modifica: 02 Agosto 2015, 01:47:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #6 il: 02 Agosto 2015, 10:29:26 »
Non me, ma San Midi (...sempre sia lodato !) devi ringraziare.
Ecco. Lo sapevo: anche tu vuoi scaricarti le tue responsabilità  ;)

Se non erro, mi compare anche sul mio portatile, però solo quando aggiorno Gambas.
Cioè? Io ho sempre la versione 3.7.1 su Linux Mint Mate, aggiornata un paio di volte con il gestore degli aggiornamenti (mintupdate 4.9.2) che. p. es., ora mi propone un  nuovo aggiornamento di gambas3 chiamato "Ambiente visuale completo per Gambas" (3.8.0-27.38-Ubuntu14.04.1).

Ti suggerisco di fare una ricerca su Google inserendo questa riga come chiave di ricerca. Magari anche aggiungendo la parola Gambas.
Ok.

Si deve chiudere la libreria, precedentemente inizializzata.
Procedi così...
Ok.
Dopo la modifica il messaggio è cambiato. Ora è "AL lib: FreeContext: (0x1712460) Deleting 19 Source(s)", che sembra puramente informativo.
Grazie mille.
Chiuderò la discussione più tardi, dopo la modifica del solitario. Intanto vi mando la presentazione in html che uso come help, compressa in un file tar.gz. Ciao


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #7 il: 02 Agosto 2015, 15:01:05 »
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:
Codice: gambas [Seleziona]
Private ii As New Integer[]


2) Modifica la sub-routine " Sub Button1_Click() " come segue:
Codice: gambas [Seleziona]
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:
Codice: gambas [Seleziona]
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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #8 il: 02 Agosto 2015, 19:31:59 »
Bravo. Questa volta ci siamo. Non esce più nessun messaggio alla chiusura.
A presto.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #9 il: 02 Agosto 2015, 19:57:36 »
Non esce più nessun messaggio alla chiusura.

Accendi due ceri a San Midi e recita una prece:

 sanmidi

" O San Midi benedetto,
  Santo musico anacoreta,
  nel buio cieco io vagavo, me maldetto !
  Benigno tu mostrasti a me la meta.
"
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #10 il: 03 Agosto 2015, 08:35:02 »
Certo, deve essere un gran santo miracoloso questo Midi. Io ne avrei di preghiere per casi disperati da rivolgergli :).
Oremus, amen.
Intanto mi sono accorto di non avere incluso le immagini nel file "solitgio_help.tar.gz", quindi lo riallego.
Ciao

Offline Cocirio

  • Grande Gambero
  • ***
  • Post: 126
  • Sba(di)gliando s'impapera :-).
    • Mostra profilo
Re: suoni prodotti con sdl2.audio
« Risposta #11 il: 03 Agosto 2015, 16:06:38 »
Bene. Ora il solitario è pronto. Se qualcuno lo volesse provare e, magari, aiutarmi a migliorarlo, me lo faccia sapere con un messaggio pubblico o privato.
Ciao