Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Error con Sound_Play en 2.2

Iniciado por Hechelion, 10 de Octubre de 2008, 05:48:28 AM

« anterior - próximo »

Hechelion

Buenas nuevamente, de seguro que a estas alturas ya me odias  0:-)

Cerrando mi proyecto me decidí a darle algunos efectos de sonido y me acabo de encontrar con un error, al utilizar Sound_Play, de partida no reproduce nada y me devuelve un valor astronómico (2 mill millones y fracción), he probado el mismo código pero con la librería 2.1 y esta si funciona (devuelve 0 y se escucha el sonido.)

[EX3]

Extraño por que tengo los tutos listos de la parte de audio y no me he encontrado con error alguno, incluso un compañero se esta armando no se que de sonido con la libreria y tampoco me ha dicho nada de fallos  ???

Lo del valor astronomico es la notacion de errores que usan algunos componentes en Visual Basic para el control de errores, en dx_lib32 tome el mismo camino. Compara ese numero con las constantes de la enumeracion SND_ErrorCodes y dime que error es el que te da. Aun asi, muestrame mas o menos como lo tienes implementado por si el error viniese por otra cosa o para poder intentar reproducir el error en casa y averiguar de que se trata.

Salu2...

P.D.:
Cita de: Hechelion en 10 de Octubre de 2008, 05:48:28 AM
de seguro que a estas alturas ya me odias  0:-)
Espero que no hayas puesto tu ubicacion real en el mapa del perfil por que ire a esperarte a la puerta de tu casa  >:D  ;)
Que seria de este tipo de proyectos sin la colaboracion de los usuarios a la hora de reportar bugs :)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

#2
esto es lo que tengo con respecto al audio.

Código (vb) [Seleccionar]

Dim m_Sound As dx_Sound_Class 'Referencia a la calse dx_Sound.
'Variables para contener indicadores a sonidos
Dim MusicaFondo As Long
Dim SndTeclear As Long
Dim SndClickBoton As Long
Dim SndClickPlaneta As Long
Dim SndAlarma As Long
....
....
....
'Cargamos música en memoria
MusicaFondo = m_Sound.MUSIC_Load(App.Path & "\Recursos\sound\artificial_intelligence_v3.ogg")

'Cargamos efectos de sonido
SndTeclear = m_Sound.SOUND_Load(App.Path & "\Recursos\sound\text_typing.wav")
SndClickBoton = m_Sound.SOUND_Load(App.Path & "\Recursos\sound\button_click.wav")
SndClickPlaneta = m_Sound.SOUND_Load(App.Path & "\Recursos\sound\fleet_button_rollover.wav")
SndAlarma = m_Sound.SOUND_Load(App.Path & "\Recursos\sound\alert.wav")
....
....
Private Sub Form_Load()
....
....
Set m_Sound = New dx_Sound_Class 'Creamos la referencia a la clase dx_Sound:
Call m_Sound.Init(Me.hWnd) 'Inicializamos la clase dx_Sound.
....
....
If HayMusica Then If Not (m_Sound.MUSIC_Play(MusicaFondo, Primary_Buffer, True)) Then Log_Error "Error al reproducir música de fondo" 'invocar la música de fondo) <-- Este comando sobre un OGG funciona impecable, nada que decir.
....
....
end sub
....
....
....
'Rutina referente a input e ingreso de datos
Call m_Sound.SOUND_Play(SndTeclear, -1, False) '<--- estan "SOUND_Play son las que no se escuchan y cuando reviso el valor que devuelven me dan un valor sobre los 2 mil millones



En todo caso, como te decía anteriormente, este mismo código pero con la librería 2.1 me ejecuta el sonido sin problema y me retorna valor 0.ç

EDIT:
El valor que retorna es 2.147.218.505

PD: Ni en sueño doy mi posición en el mapa  :..

[EX3]

Genia, el error que devuelve es SND_UNKNOWNERROR, error desconocido o interno de la libreria (error no contemplado, vamos), empezamos bien ^_^' Acabo de probar esto:

Código (qbasic) [Seleccionar]
Option Explicit

Dim audio As New dx_Sound_Class
Dim sample As Long
Dim music As Long

Private Sub Command1_Click()
    audio.SOUND_Play sample, -1, False
End Sub

Private Sub Form_Load()
    audio.Init Me.hWnd
    sample = audio.SOUND_Load(App.Path & "\sample.wav")
    music = audio.MUSIC_Load(App.Path & "\AnotherWorld.ogg")
    audio.MUSIC_Play music, Primary_Buffer, True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    audio.MUSIC_Stop Primary_Buffer
    audio.MUSIC_Unload music
    audio.SOUND_Unload sample
    audio.Terminate
    End
End Sub

Ha funcionado sin problema. Copia el codigo y mira a ver si te funciona, para descartar que sea fallo aislado en tu proyecto.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

#4
Acabo de probar con el código que dejaste y me he dado cuenta que el problema se presenta con 3 de los 5 archivos de audio que tengo.
así que creo que la mejor opción es que te envíe un correo con uno de los archivos (pesan la nada misma).

PD: Recuerda que si cambio la referencia a la librería con versión 2.1, el sistema me reproduce cualquiera de los 5 archivos sin problema.

Edit. me acabo de dar cuenta que no hay opción para enviarte correo (imagino que para librarte de los molestos usuarios), así que subí el archivo a rapidshare
http://rapidshare.com/files/152653047/text_typing.wav.html

[EX3]

Si el fallo te da con la ultima version pero no con la anterior quizas sea por los arreglos que hice de los canales que fallaba al seleccionar los libres, pero que marque error desconocido me mosquea. Esta tarde le intento echar un vistazo a tu codigo a ver que veo.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

se agradece Ex3, en todo caso yo voy saliendo todo el fin de semana así que dudo probar cualquier modificación hasta la próxima semana, si puedes prueba con el archivo que subí, que es uno de los que me da problema al tratar de reproducirlo.

[EX3]

Localizado el error pero me temo que sin solucion, te explico por que. Con la version 2.1 no te da error por que esta no implementaba el sistema de efectos de DirectSound. La version 2.2.0 si lo hace y el flag que configura los bufferes de sonido donde se almacenan y reproducen los wavs para soportar los efectos parece que da error con archivos muy pequeños (de excesiva corta duracion) como el que has subido. Lo he confirmado añadiendole un milisegundo de silencio y lo ha cargado sin problemas.

Aviso que hay otros problemas similares con esto de los efectos y es que si el archivo tiene un formato muy pobre de audio (8bits, mono, etc...) se podra cargar y reproducir el sonido pero no se le podra aplicar efectos. Esto se solucionaria cambiando el formato a uno adecuado (16bits y/o stereo por ejemplo).

Esto en teoria, si supiera como se añade silencio a un buffer a traves de DirectSound la propia libreria podria añadir ese milisegundo de silencio al cargar los archivos y evitar estos problemas pero es que no se como hacerlo ya que el error lo da justo al crear el buffer y cargar el archivo  :(

La solucion que puedo darte es que te bajes Audacity o cualquier otro programa de edicion de audio (GoldWave tambien estaba genial para estas tareas) y modifiques a mano o en bateria (batch) los archivos que te den este problema.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

Gracias por la respuesta, voy a modificar la duración de los archivos entonces.

[EX3]

No estoy demasiado puesto en DirectSound como a mi me gustaria pero estoy buscando la forma de que la propia dx_lib32 añada ese milisegundo al cargar el buffer, utilizando un buffer sin efectos y despues pasando los bytes modificados al buffer final con efectos, si hay suerte sera un bug corregido en la version final pero primer tengo que averiguar como se añade un silencio en bytes al buffer (supongo que rellenando con ceros  ???)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

synchrnzr

Citarsupongo que rellenando con ceros

Rellenando con 0s si es de 16bits o más y rellenando con 128s si es de 8bits. Cosas del Windows: los buffers de 8bits son unsigned, con biasing en 128, y el resto de formatos es signed como Dios manda. En realidad no hay mucha diferencia, si rellenas ambos con 0s tampoco se oirá. Pero te puede traer problemas de clipping y además puede que oigas algún clic al final del buffer.

sync



[EX3]

#11
Agradecida y oportuna su visita por estos lares, caballero, ya estaba pensando preguntar esto por el foro de programacion de audio :)

Cita de: synchrnzr en 15 de Octubre de 2008, 12:45:19 PM
Rellenando con 0s si es de 16bits o más y rellenando con 128s si es de 8bits. Cosas del Windows: los buffers de 8bits son unsigned, con biasing en 128, y el resto de formatos es signed como Dios manda. En realidad no hay mucha diferencia, si rellenas ambos con 0s tampoco se oirá. Pero te puede traer problemas de clipping y además puede que oigas algún clic al final del buffer.
Vamos, que no es un proceso simple de agregar valores nulos al buffer como pensaba. Pues no se si me merece la pena meterme en estos fregados si solo lo preciso para sonidos de extrema corta duracion :-\

Aun asi, creo que tengo una posible solucion al tema sin necesidad de andar metiendo mano a los bufferes y que seria facil de implementar. Si no carga el sonido en el buffer configurado para usar efectos que vuelva a intentar la carga en el mismo buffer pero configurado sin efectos, como en la version 2.1 de la libreria. Total, cada buffer es independiente y no interfiere con el resto del codigo implementado salvo las funciones de efectos. A ver si puedo probarlo esta tarde cuando llegue a casa.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

synchrnzr

CitarVamos, que no es un proceso simple de agregar valores nulos al buffer como pensaba. Pues no se si me merece la pena meterme en estos fregados si solo lo preciso para sonidos de extrema corta duracion

Cuidado con la hernia discal, no vaya a ser que mirando si son de 8 o 16 bits para meter un 0 o un 128... :P

sync

[EX3]

Cita de: synchrnzr en 15 de Octubre de 2008, 05:00:21 PM
Cuidado con la hernia discal, no vaya a ser que mirando si son de 8 o 16 bits para meter un 0 o un 128... :P
Si primero averiguo como obtengo esa informacion del objeto DirectSoundSecondaryBuffer8 pues todavia (repito que no estoy tan puesto en DirectSound como me gustaria a mi :P) El tema es:
Cita de: synchrnzr en 15 de Octubre de 2008, 12:45:19 PM
Pero te puede traer problemas de clipping y además puede que oigas algún clic al final del buffer.
Si me dices que haciendo esto puedo generar imperfecciones en las secuencias de audio pues tampoco me interesa como comprenderas ;)

Aun asi mirare si funciona mi idea que comente antes.

Salu2...

Edit: Vale, echando un vistazo por lo alto acabo de ver la funcion GetFormat() del objeto DirectSoundSecondaryBuffer8 y la estructura WAVEFORMATEX que devuelve ::)
Pregunta tonta para un pobre entendido en programacion de audio, cuantos bytes equilvalen a un milisegundo en el buffer?
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

synchrnzr

#14
Lo del clipping te pasará sólo si rellenas los buffers de 8 bits con 0 en vez de 128.

CitarEffects might not work smoothly on very small buffers. DirectSound does not permit the creation of effects-capable buffers that hold less than 150 milliseconds of data. This value is defined as DSBSIZE_FX_MIN.

Como ves tienes que añadir 150ms para poder aplicar efectos (ya decía yo que eso de 1ms me parecía muy poco) Uno de los campos de WAVEFORMATEX es precisamente los bytes por segundo, nAvgBytesPerSec. Sólo tienes que multiplicarlo por 0.150 para obtener la longitud mínima que tiene que tener el buffer y ya está, a lo que no llegue el sample lo rellenas con silencio y a cascarla.

sync

PD: Nótese que los bytes por segundo pueden variar, depende de la frecuencia, los bits por sample y el número de canales, en realidad:

nAvgBytesPerSec = frecuencia * bytes por sample * número de canales







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.