Registrare un file WAV mediante le funzioni esterne del API di PulseAudio
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, 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
' 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)
Print "chiude" ' 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
' Impostiamo 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