Muchas gracias Vuot, ha resultado muy útil tu aportación.
Creo que con un array tipo 'Byte' perdería mucho la resolución. Con 'Short' queda bien.
La solución 'gb.media' funciona bien, pero hay que exportar un fichero auxiliar para luego volver a importarlo, que es lo que quería evitar.
Lo que parece mejor es la API de ALSA. Todavía tengo que trabajar mas con esto, pero ya he conseguido que suene. Ahora tengo que afinarlo (por ejemplo, para que suene en estéreo, con dos canales de audio). Esto es un ejemplo del código con la API de ALSA. Es una implementación muy simple, pero funciona. Cualquier idea de mejora será bienvenida:
'array con las muestras de audio
private xondaL as new short[]
'frecuencia de muestreo
private fmuestreo as integer = 44100
'librera API de ALSA
Library "libasound:2.0.0"
Private Const device As String = "default"
Private Const SND_PCM_STREAM_PLAYBACK As Integer = 0
Private Const SND_PCM_FORMAT_S16_LE As Byte = 2
Private Const SND_PCM_ACCESS_RW_INTERLEAVED As Integer = 3
Private Extern snd_pcm_open(pcm As Pointer, name As String, pcm_stream As Integer, mode As Integer) As Integer
Private Extern snd_pcm_set_params(pcm As Pointer, formatI As Integer, accesso As Integer, channels As Integer, rate As Integer, soft_resample As Integer, latency As Integer) As Integer
Private Extern snd_pcm_writei(pcm As Pointer, buffer As Short[], size As Integer) As Integer
Private Extern snd_strerror(errnum As Integer) As String
Private Extern snd_pcm_close(pcm As Pointer)
'---------
'Aquí va la aplicación para generar las muestras de audio
'---------
Public Sub AlsaPlay()
Dim err, frames As Integer
Dim handle As Pointer
err = snd_pcm_open(VarPtr(handle), device, SND_PCM_STREAM_PLAYBACK, 0)
If err < 0 Then Error.Raise("Error en la apertura del sub-sistema PCM: " & snd_strerror(err))
err = snd_pcm_set_params(handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1, fmuestreo, 1, 500000)
If err < 0 Then Error.Raise("Error en los parmetros del sub-sistema PCM: " & snd_strerror(err))
frames = snd_pcm_writei(handle, xondaL, xondaL.Length)
If frames < 0 Then Error.Raise("Error en la funcion 'snd_pcm_writei' !")
snd_pcm_close(handle)
End