Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] NAudio: Ajuste de volumen

Estas en el tema de NAudio: Ajuste de volumen en el foro de .NET en Foros del Web. Hola, estoy haciendo un programa que usa NAudio (http://naudio.codeplex.com/) para reproducir sonidos. Pues bien, me gustaría que cada sonido se pudiera reproducir a volumen diferente, ...
  #1 (permalink)  
Antiguo 03/06/2013, 14:54
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 4 meses
Puntos: 2
NAudio: Ajuste de volumen

Hola, estoy haciendo un programa que usa NAudio (http://naudio.codeplex.com/) para reproducir sonidos.

Pues bien, me gustaría que cada sonido se pudiera reproducir a volumen diferente, pero sólo consigo cambiar el volumen a todos los sonidos a la vez, aquí va todo el código:

Código vb:
Ver original
  1. Imports NAudio.Wave
  2.  
  3. Public Class Form1
  4.  
  5.     Private Sound1 As WaveOut
  6.     Private Sound2 As WaveOut
  7.  
  8.  
  9.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  10.         Label3.Text = Val(Volume1.Value) / 10
  11.         Label4.Text = Val(Volume2.Value) / 10
  12.     End Sub
  13.  
  14.     Private Sub Volume1_Scroll(sender As Object, e As EventArgs) Handles Volume1.Scroll
  15.         Label3.Text = Val(Volume1.Value) / 10
  16.         Sound1.Volume = Val(Volume1.Value) / 10
  17.  
  18.     End Sub
  19.  
  20.     Private Sub Volume2_Scroll(sender As Object, e As EventArgs) Handles Volume2.Scroll
  21.         Label4.Text = Val(Volume2.Value) / 10
  22.         Sound2.Volume = Val(Volume2.Value) / 10
  23.  
  24.     End Sub
  25.  
  26.     Private Sub Play1_Click(sender As Object, e As EventArgs) Handles Play1.Click
  27.         Dim inputStream As WaveChannel32
  28.         Dim readerhum As New WaveFileReader(Application.StartupPath & "\media\2010Hum.wav")
  29.         inputStream = New WaveChannel32(readerhum)
  30.         Sound1 = New WaveOut()
  31.         Sound1.Init(readerhum)
  32.         ' Aquí determinamos el volumen en concreto de Hum, pero afecta también a
  33.        Sound1.Volume = Volume1.Value
  34.         Sound1.Play()
  35.         ' Activar el deslizador ahora porque usarlo antes de iniciar el sonido provoca un error.
  36.        Volume1.Enabled = True
  37.     End Sub
  38.  
  39.     Private Sub Play2_Click(sender As Object, e As EventArgs) Handles Play2.Click
  40.         Dim inputStream As WaveChannel32
  41.         Dim reader As New WaveFileReader(Application.StartupPath & "\media\Drum.wav")
  42.         inputStream = New WaveChannel32(reader)
  43.         Sound2 = New WaveOut
  44.         Sound2.Init(reader)
  45.         Sound2.Volume = Volume2.Value
  46.         Sound2.Play()
  47.         ' Activar el deslizador ahora porque usarlo antes de iniciar el sonido provoca un error.
  48.        Volume2.Enabled = True
  49.     End Sub
  50. End Class

Me explico un poco mejor, el resultado debe ser este: dos botones, cada uno reproduce un sonido diferente, y dos trackbars, cada una controla el volumen de un solo sonido. Eso es lo que hecho (obviamente sin lograr que los controles de volumen sean independientes) en el código fuente anterior como podéis ver en el proyecto del que pongo el enlace a continuación:

Enlace al proyecto entero de ejemplo: https://www.dropbox.com/s/zhynzq3xgaw1cyd/Pruebas.zip

Última edición por vistaero; 03/06/2013 a las 17:51
  #2 (permalink)  
Antiguo 06/06/2013, 17:36
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 12 años, 10 meses
Puntos: 344
Respuesta: NAudio: Ajuste de volumen

Hola de nuevo,

Investigando un poco (no tengo mucha experiencia trabajando con audio) he visto que hay dos conceptos distintos: el audio del dispositivo (device level) y el audio del archivo (sample level).

Como estás usando WaveOut para reproducir distintos archivos .wav, todos están usando el mismo dispositivo (a no ser que le indicases que usasen otros, en caso de haberlos) y al cambiar el volumen de uno de los objetos en realidad está afectando al volumen del dispositivo.

Una forma que he visto de solucionarlo (hay más creo) es usar AudioFileReader en vez de WaveFileReader, puesto que el primero tiene la propiedad Volume que permite cambiar el volumen de reproducción de sólo ese archivo.

Ejemplo:

Código vb:
Ver original
  1. Dim Noise As WaveOut
  2.  Dim NoiseReader As AudioFileReader
  3.  
  4. NoiseReader = New AudioFileReader(Application.StartupPath & "\media\2010\Noise.wav")
  5. Dim looping As New LoopStream(NoiseReader)        '  
  6.  
  7. Noise = New WaveOut()
  8. Noise.Init(looping)
  9. Noise.Play()

Ahora en todos los sitios donde quieras cambiar el volumen tendrás que usar el NoiseReader


Código vb:
Ver original
  1. NoiseReader.Volume = 'Lo que sea

He estado probandolo y funciona, pero hay que mirar un poco sobre como funciona el valor del volumen, puesto que creo que depende del volumen del dispositivo y del volumen del sample.

Espero que te sirva y estamos aquí para cualquier cosa.

Un saludo.
  #3 (permalink)  
Antiguo 07/06/2013, 13:23
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 4 meses
Puntos: 2
Respuesta: NAudio: Ajuste de volumen

¡Muchas gracias, funciona perfecto, de gran ayuda como siempre!

Etiquetas: ajuste, volumen
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:11.