Differenze tra le versioni di "Registrare un file WAV mediante le funzioni esterne del API di PulseAudio"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Private Const BUFSIZE As Integer = 1024 Library "libpulse-simple:0.0.4" Public Struct pa_sample_spec formato As Byte rate As Integer channels As Byte End Struct Priva...')
 
Riga 1: Riga 1:
Private Const BUFSIZE As Integer = 1024
+
Di seguito mostriamo un semplice esempio per registrare per 13 secondi dati audio e salvarli in un file di formato WAV:
 
+
Private Const BUFSIZE As Integer = 1024
Library "libpulse-simple:0.0.4"
+
 
+
Library "libpulse-simple:0.0.4"
Public Struct pa_sample_spec
+
  formato As Byte
+
Public Struct pa_sample_spec
  rate As Integer
+
  formato As Byte
  channels As Byte
+
  rate As Integer
End Struct
+
  channels As Byte
 
+
End Struct
Private Const PA_SAMPLE_S16NE As Integer = 3       ' Signed 16 Bit PCM, little endian (PC)
+
Private Const PA_STREAM_RECORD As Integer = 2
+
Private Const PA_SAMPLE_S16NE As Integer = 3   <FONT Color=gray>' ''Signed 16 Bit PCM, little endian (PC)''</font>
 
+
Private Const PA_STREAM_RECORD As Integer = 2
' pa_simple* pa_simple_new (const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error)
+
' Create a new connection to the server.
+
<FONT Color=gray size=1>' ''pa_simple* pa_simple_new (const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error)''
Private Extern pa_simple_new(server As String, name As String, pa_dir As Integer, dev As String, stream_name As String, sample_spec As Pa_sample_spec, channel_map As Pointer, attr As Pointer, pa_Err As Pointer) As Pointer
+
' ''Create a new connection to the server.''</font>
 
+
Private Extern pa_simple_new(server As String, name As String, paDir As Integer, dev As String, strnam As String, paSamp As Pa_sample_spec, chanmap As Pointer, attr As Pointer, paErr As Pointer) As Pointer
' int pa_simple_read (pa_simple * s, void * data, size_t bytes, int * error)
+
' Read some data from the server.
+
<FONT Color=gray>' ''int pa_simple_read (pa_simple * s, void * data, size_t bytes, int * error)''
Private Extern pa_simple_read(pa_simple As Pointer, data As Pointer, bytes As Integer, pa_Err As Pointer) As Integer
+
' ''Read some data from the server.''</font>
 
+
Private Extern pa_simple_read(pa_simple As Pointer, data As Pointer, bytes As Integer, pa_Err As Pointer) As Integer
' void pa_simple_free (pa_simple *s)
+
' Close and free the connection to the server.
+
<FONT Color=gray>' ''void pa_simple_free (pa_simple *s)''
Private Extern pa_simple_free(pa_simple As Pointer)
+
' ''Close and free the connection to the server.''</font>
 
+
Private Extern pa_simple_free(pa_simple As Pointer)
 
+
 
+
 
+
'''Public''' Sub Main()
Public Sub Main()
+
 
 
 
   Dim pass As New Pa_sample_spec
 
   Dim pass As New Pa_sample_spec
 
   Dim err, ciclo As Integer
 
   Dim err, ciclo As Integer
Riga 37: Riga 36:
 
   Dim s As Short
 
   Dim s As Short
 
    
 
    
' viene impostato il tipo di campione audio da usare:
+
<FONT Color=gray>' ''Viene impostato il tipo di campione audio da usare:''</font>
    With pass
+
  With pass
      .formato = PA_SAMPLE_S16NE
+
    .formato = PA_SAMPLE_S16NE
      .rate = 44100
+
    .rate = 44100
      .channels = 2
+
    .channels = 2
    End With
+
  End With
 
      
 
      
' Crea il flusso di registrazione:
+
<FONT Color=gray>' ''Crea il flusso di registrazione:''</font>
    ps = pa_simple_new(Null, Application.Name, PA_STREAM_RECORD, Null, "registrazione", pass, 0, 0, 0)
+
  ps = pa_simple_new(Null, Application.Name, PA_STREAM_RECORD, Null, "registrazione", pass, 0, 0, 0)
    If IsNull(ps) Then Error.Raise("Errore alla funzione 'pa_simple_new()' !")
+
  If IsNull(ps) Then Error.Raise("Errore alla funzione 'pa_simple_new()' !")
 
      
 
      
    dati_audio = "/tmp/file"
+
  dati_audio = "/tmp/file"
 
      
 
      
    fl = Open dati_audio For Create
+
  fl = Open dati_audio For Create
 
      
 
      
    ciclo = 100000000 / pass.rate
+
  ciclo = 100000000 / pass.rate
 
      
 
      
    While ciclo > 0
+
  While ciclo > 0
 
        
 
        
      Dec ciclo
+
    Dec ciclo
 
+
   
 
+
    buf = New Byte[BUFSIZE]
      buf = New Byte[BUFSIZE]
 
 
        
 
        
' Registra alcuni dati audio:
+
<FONT Color=gray>' ''Registra alcuni dati audio:''</font>
      err = pa_simple_read(ps, buf.data, buf.Count, 0)
+
    err = pa_simple_read(ps, buf.data, buf.Count, 0)
      If err < 0 Then Error.Raise("Errore alla funzione 'pa_simple_read()' !")
+
    If err < 0 Then Error.Raise("Errore alla funzione 'pa_simple_read()' !")
 
 
      For s = 0 To buf.Max
 
      Write #fl, buf[s] As Byte
 
    Next
 
 
      
 
      
    Wend
+
    For s = 0 To buf.Max
crea_file(dati_audio)
+
      Write #fl, buf[s] As Byte
Print "chiude"
+
    Next
' Va in Chiusura:
+
   
  fl.Close
+
  Wend
  pa_simple_free(ps)
 
  Quit
 
 
 
End
 
 
 
 
 
Private Procedure crea_file(tmp As String)
 
 
   
 
   
Dim dati As String
+
  crea_file(dati_audio)
Dim i As Integer
 
 
    
 
    
' Impostiamo il blocco iniziale generico del file WAV:
+
<FONT Color=gray>' ''Va in chiusura:''</font>
  Dim intesta1 As Byte[] = [82, 73, 70, 70]
+
  fl.Close
  Dim intesta2 As Byte[] = [87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 2, 0,
+
  pa_simple_free(ps)
                          &44, &AC, 0, 0, &10, &B1, 2, 0, 4, 0, 16, 0, &64, &61, &74, &61]
+
  Quit
 +
 
 +
'''End'''
 +
   
 +
 +
'''Private''' Procedure crea_file(tmp As String)
 +
   
 +
  Dim dati As String
 +
  Dim i As Integer
 
    
 
    
   dati = File.Load(tmp)
+
<FONT Color=gray>' ''Imposta il blocco iniziale generico del file WAV:''</font>
   i = Len(dati) + 36
+
   Dim intesta1 As Byte[] = [82, 73, 70, 70]
 +
   Dim intesta2 As Byte[] = [87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 2, 0,
 +
                          &44, &AC, 0, 0, &10, &B1, 2, 0, 4, 0, 16, 0, &64, &61, &74, &61]
 
    
 
    
' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file:
+
  dati = File.Load(tmp)
  intesta1.Add(i And &FF)
+
  i = Len(dati) + 36
  intesta1.Add(Shr(i And &FF00&, 8))
+
 
  intesta1.Add(Shr(i And &FF0000&, 16))
+
<FONT Color=gray>' ''Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file:''</font>
  intesta1.Add(Shr(i And &FF000000&, 24))
+
  intesta1.Add(i And &FF)
  intesta1.Insert(intesta2)
+
  intesta1.Add(Shr(i And &FF00&, 8))
  i = Len(dati)
+
  intesta1.Add(Shr(i And &FF0000&, 16))
  intesta1.Add(i And &FF)
+
  intesta1.Add(Shr(i And &FF000000&, 24))
  intesta1.Add(Shr(i And &FF00&, 8))
+
  intesta1.Insert(intesta2)
  intesta1.Add(Shr(i And &FF0000&, 16))
+
  i = Len(dati)
  intesta1.Add(Shr(i And &FF000000&, 24))
+
  intesta1.Add(i And &FF)
 +
  intesta1.Add(Shr(i And &FF00&, 8))
 +
  intesta1.Add(Shr(i And &FF0000&, 16))
 +
  intesta1.Add(Shr(i And &FF000000&, 24))
 
    
 
    
' Per generare il file WAV finale, eseguibile, uniamo i dati del blocco iniziale ai dati grezzi registrati:
+
<FONT Color=gray>' ''Per generare il file WAV finale, eseguibile, uniamo i dati del blocco iniziale ai dati grezzi registrati:''</font>
  File.Save("/tmp/FileFINALE.wav", intesta1.ToString(0, intesta1.Count) & dati)
+
  File.Save("/tmp/FileFINALE.wav", intesta1.ToString(0, intesta1.Count) & dati)
 
   
 
   
End
+
'''End'''

Versione delle 16:43, 25 giu 2015

Di seguito mostriamo un semplice esempio per registrare per 13 secondi dati audio e salvarli in un file di formato WAV:

Private Const BUFSIZE As Integer = 1024

Library "libpulse-simple:0.0.4"

Public Struct pa_sample_spec
  formato As Byte
  rate As Integer
  channels As Byte
End Struct

Private Const PA_SAMPLE_S16NE As Integer = 3    ' Signed 16 Bit PCM, little endian (PC)
Private Const PA_STREAM_RECORD As Integer = 2

' pa_simple* pa_simple_new (const char * server, const char * name, pa_stream_direction_t dir, const char * dev, const char * stream_name, const pa_sample_spec * ss, const pa_channel_map * map, const pa_buffer_attr * attr, int * error)
' Create a new connection to the server.
Private Extern pa_simple_new(server As String, name As String, paDir As Integer, dev As String, strnam As String, paSamp As Pa_sample_spec, chanmap As Pointer, attr As Pointer, paErr As Pointer) As Pointer

' int pa_simple_read (pa_simple * s, void * data, size_t bytes, int * error)
' Read some data from the server.
Private Extern pa_simple_read(pa_simple As Pointer, data As Pointer, bytes As Integer, pa_Err As Pointer) As Integer

' void pa_simple_free (pa_simple *s)
' Close and free the connection to the server.
Private Extern pa_simple_free(pa_simple As Pointer)


Public Sub Main()

 Dim pass As New Pa_sample_spec
 Dim err, ciclo As Integer
 Dim ps As Pointer
 Dim buf As Byte[]
 Dim fl As File
 Dim dati_audio As String
 Dim s As Short
 
' Viene impostato il tipo di campione audio da usare:
  With pass
    .formato = PA_SAMPLE_S16NE
    .rate = 44100
    .channels = 2
  End With
   
' Crea il flusso di registrazione:
  ps = pa_simple_new(Null, Application.Name, PA_STREAM_RECORD, Null, "registrazione", pass, 0, 0, 0)
  If IsNull(ps) Then Error.Raise("Errore alla funzione 'pa_simple_new()' !")
   
  dati_audio = "/tmp/file"
   
  fl = Open dati_audio For Create
   
  ciclo = 100000000 / pass.rate
   
  While ciclo > 0
     
    Dec ciclo
    
    buf = New Byte[BUFSIZE]
     
' Registra alcuni dati audio:
    err = pa_simple_read(ps, buf.data, buf.Count, 0)
    If err < 0 Then Error.Raise("Errore alla funzione 'pa_simple_read()' !")
    
    For s = 0 To buf.Max
      Write #fl, buf[s] As Byte
    Next
    
  Wend

  crea_file(dati_audio)
 
' Va in chiusura:
  fl.Close
  pa_simple_free(ps)
  Quit
  
End


Private Procedure crea_file(tmp As String)

 Dim dati As String
 Dim i As Integer
 
' Imposta il blocco iniziale generico del file WAV:
 Dim intesta1 As Byte[] = [82, 73, 70, 70]
 Dim intesta2 As Byte[] = [87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 2, 0,
                          &44, &AC, 0, 0, &10, &B1, 2, 0, 4, 0, 16, 0, &64, &61, &74, &61]
 
  dati = File.Load(tmp)
  i = Len(dati) + 36
  
' Imposta il valore dimensionale di 4 byte a partire dal 5° byte del futuro file:
  intesta1.Add(i And &FF)
  intesta1.Add(Shr(i And &FF00&, 8))
  intesta1.Add(Shr(i And &FF0000&, 16))
  intesta1.Add(Shr(i And &FF000000&, 24))
  intesta1.Insert(intesta2)
  i = Len(dati)
  intesta1.Add(i And &FF)
  intesta1.Add(Shr(i And &FF00&, 8))
  intesta1.Add(Shr(i And &FF0000&, 16))
  intesta1.Add(Shr(i And &FF000000&, 24))
 
' Per generare il file WAV finale, eseguibile, uniamo i dati del blocco iniziale ai dati grezzi registrati:
  File.Save("/tmp/FileFINALE.wav", intesta1.ToString(0, intesta1.Count) & dati)

End