Comando Play De Sox Como Proceso. SOLUCIONADO


Objetivo: Comando Play De Sox Como Proceso. SOLUCIONADO
Hola a todos.
Estoy intentando usar el comando play del paquete sox, para que reproduzca sonidos en mi aplicación.
El caso es que creo un proceso donde hago que se ejecute play con EXEC y no consigo saber cuando termina el proceso de ejecutarse.
Es una aplicación que habla y el problema es que en momentos se interfieren peticiones para que diga algo, y eso hace que no reproduzca algunas peticiones. La única solución que he encontrado hasta ahora es meter un wait de cierto tiempo, pero no es muy útil al ser frases de diferentes tamaños y que no conozco de antemano.

Me explico mejor con el código.


Public Reproducir As Process

Public Sub Hablar(texto As String)

Try Kill "/tmp/a.wav"
FMain.TxtAVoz.text = texto

Exec ["pico2wave", "-l", "es-ES", "-w", "/tmp/a.wav", "\"" & texto & "\""] To texto
Reproducir = Exec ["play", "/tmp/a.wav"]
Reproducirlo()

End

Public Sub Reproducirlo()

If Reproducir.Running Then 'Si está en ejecución, espero con el bucle

Reproducirlo()

Else

[color=#FF0000]"NUNCA ENTRA AQUÍ" [/color]

Endif


última edición por celtilander el Miercoles, 22 Junio 2016, 00:10; editado 1 vez
Perfil MP  
Objetivo: Re: Comando Play De Sox Como Proceso.
Public Sub Reproducirlo()

If Reproducir.Running Then 'Si está en ejecución, espero con el bucle

Reproducirlo()

Else

Aquí creo que deberías usar wait. Algo así:
Reproducir = Exec ["play", "/tmp/a.wav"]
while reproducir.Running
wait 0.01
wend

Esto comprueba cada centésima de segundo el estado del proceso y deja abierto el bucle para la ejecución de eventos (tecla cancelar o lo que sea)

Espero que te sirva.

Saludos.

Perfil MP  
Objetivo: Re: Comando Play De Sox Como Proceso.
shordi escribió: [Ver mensaje]
Public Sub Reproducirlo()

If Reproducir.Running Then 'Si está en ejecución, espero con el bucle

Reproducirlo()

Else

Aquí creo que deberías usar wait. Algo así:
Reproducir = Exec ["play", "/tmp/a.wav"]
while reproducir.Running
wait 0.01
wend

Esto comprueba cada centésima de segundo el estado del proceso y deja abierto el bucle para la ejecución de eventos (tecla cancelar o lo que sea)

Espero que te sirva.

Saludos.


Gracias shordi por tu ayuda. Pero eso es precisamente lo que no funciona. Se queda Running todo el rato y no acaba con el proceso. Ya probé ese código y se queda en un bucle sin fin ya que nunca sale del running
Probé a usar Reproducir.Kill o Reproducir.Close, pero no valen de nada ya que no tengo control para saber cuando acaba la ejecución del play.. A veces ya se me da por pensar si es una especie de bug.
Saludos.

Por cierto, probé smplayer ejecutándolo desde consola con la opción "-close-at-end", que aunque sea un coñazo, ya que abre un gui, tampoco funciona como creo entender debería el "proceso".
Tambien probé con music de gb.sdl.sound según me dijo Julio, pero no se por qué motivo me genera mucho ruido.

última edición por celtilander el Martes, 21 Junio 2016, 19:25; editado 3 veces
Perfil MP  
Objetivo: Re: Comando Play De Sox Como Proceso.
...y si te gusta usar las funciones externas de Sox: whistle

http://www.gambas-it.org/wiki/index..._del_API_di_Sox

Perfil MP  
Objetivo: Re: Comando Play De Sox Como Proceso.
Hola celtilander, mira si este ejemplo que hice te sirve para lo que queres hacer.

Saludos.


test-0.0.2.tar.gz
Descripción: Ejemplo para reproducir una pista mp3 con mplayer y dar aviso de comienzo y finalización de la reproducción. 
Descargar
Nombre del archivo: test-0.0.2.tar.gz
Tamaño: 11.95 KB
Descargado: 60 veces
test-0.0.2.tar.gz
Descripción: Ejemplo para reproducir una pista mp3 con mplayer y dar aviso de comienzo y finalización de la reproducción. 
Descargar
Nombre del archivo: test-0.0.2.tar.gz
Tamaño: 11.95 KB
Descargado: 60 veces
test-0.0.2.tar.gz
Descripción: Ejemplo para reproducir una pista mp3 con mplayer y dar aviso de comienzo y finalización de la reproducción. 
Descargar
Nombre del archivo: test-0.0.2.tar.gz
Tamaño: 11.95 KB
Descargado: 60 veces

Perfil MP  
Objetivo: Re: Comando Play De Sox Como Proceso.
Muchas gracias a todos.
Al final he utilizado el ejemplo de tincho, me pareció más acorde a mis conocimientos.
El caso es que con las pruebas realizadas y una pequeña modificación, está funcionando.

Private wtcStat As Watch
Private strFilePath As String
Private estado As Boolean

Public Sub Hablar(texto As String)

strFilePath = "/tmp/a.wav"
estado = True
Try Kill strFilePath
FMain.TxtAVoz.text = texto

Exec ["pico2wave", "-l", "es-ES", "-w", "/tmp/a.wav", "\"" & texto & "\""] To texto
Exec ["play", strFilePath]

If Exist(strFilePath) = True Then
wtcStat = New Watch(strFilePath) As "FileState"
Endif

While estado = True
Wait 1
Wend

End

Public Sub FileState_Read()

estado = True

End

Public Sub FileState_Close()

estado = False

End


Como curiosidad decir que si ajusto en valor de WAIT a menos de 1, se montan las reproducciones...
Y si interesa a alguien dejo la salida que obtengo en una prueba satisfactoria...


/tmp/a.wav:

File Size: 68.7k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.14

In:100% 00:00:02.14 [00:00:00.00] Out:34.3k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 133k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:04.15

In:100% 00:00:04.15 [00:00:00.00] Out:66.4k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

In:100% 00:00:02.26 [00:00:00.00] Out:36.2k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

In:100% 00:00:02.26 [00:00:00.00] Out:36.2k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

In:100% 00:00:02.26 [00:00:00.00] Out:36.2k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

In:100% 00:00:02.26 [00:00:00.00] Out:36.2k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

In:100% 00:00:02.26 [00:00:00.00] Out:36.2k [ | ] Hd:0.0 Clip:0
Done.

/tmp/a.wav:

File Size: 72.5k Bit Rate: 256k
Encoding: Signed PCM
Channels: 1 @ 16-bit
Samplerate: 16000Hz
Replaygain: off
Duration: 00:00:02.26

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4368s (PHP: -67% SQL: 167%)
Consultas SQL: 49 - Debug off - GZIP Activado