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

[SOLUCIONADO] NAudio en Visual Basic .NET

Estas en el tema de NAudio en Visual Basic .NET en el foro de .NET en Foros del Web. Hola, estoy intentando hacer unas cosillas básicas con una librería llamada NAudio que espero que alguien controle un poco. Esta es la página oficial: http://naudio.codeplex.com/ ...
  #1 (permalink)  
Antiguo 25/05/2013, 18:07
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 15 años
Puntos: 2
NAudio en Visual Basic .NET

Hola, estoy intentando hacer unas cosillas básicas con una librería llamada NAudio que espero que alguien controle un poco.

Esta es la página oficial: http://naudio.codeplex.com/

La razón por la que necesito ayuda, es que los ejemplos que encuentro están en C#, y aunque use un conversor online de C# a VB, el código no funciona, y como no soy programador, no tengo mucha idea de cómo arreglar los fallos que Visual Studio me detecta.

Lo que quiero hacer es simple, un botón comienza la reproducción en bucle de un sonido, y un segundo botón comienza la reproducción en bucle de un segundo sonido sin interrumpir el primero.

La razón por la que acudo a NAudio, es que tal vez su reproducción en bucle no tiene pausas de milisegundos cada vez que el sonido empieza de nuevo, y que otras formas de reproducir audio en bucle padecen.

Si alguien sabe hacer esto y quiere un sonido con el que comprobar que no hay cortes, este es uno de los que voy a usar: https://www.dropbox.com/s/6t5ks8jrh8656uu/2010%20Hum.wav

Gracias de antemano.
  #2 (permalink)  
Antiguo 25/05/2013, 20:30
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 7 meses
Puntos: 344
Respuesta: NAudio en Visual Basic .NET

Hola de nuevo,

He conseguido reproducir tal y como lo quieres y parece que no se producen cortes.

Lo primero es crear una clase para soportar la reproducción en bucle (sacado de la documentación de NAudio).

Código vb:
Ver original
  1. Imports NAudio.Wave
  2.  
  3. Public Class LoopStream
  4.     Inherits WaveStream
  5.     Private sourceStream As WaveStream
  6.  
  7.     ''' <summary>
  8.    ''' Creates a new Loop stream
  9.    ''' </summary>
  10.    ''' <param name="sourceStream">The stream to read from. Note: the Read method of this stream should return 0 when it reaches the end
  11.    ''' or else we will not loop to the start again.</param>
  12.    Public Sub New(sourceStream As WaveStream)
  13.         Me.sourceStream = sourceStream
  14.         Me.EnableLooping = True
  15.     End Sub
  16.  
  17.     ''' <summary>
  18.    ''' Use this to turn looping on or off
  19.    ''' </summary>
  20.    Public Property EnableLooping() As Boolean
  21.         Get
  22.             Return m_EnableLooping
  23.         End Get
  24.         Set(value As Boolean)
  25.             m_EnableLooping = value
  26.         End Set
  27.     End Property
  28.     Private m_EnableLooping As Boolean
  29.  
  30.     ''' <summary>
  31.    ''' Return source stream's wave format
  32.    ''' </summary>
  33.    Public Overrides ReadOnly Property WaveFormat() As WaveFormat
  34.         Get
  35.             Return sourceStream.WaveFormat
  36.         End Get
  37.     End Property
  38.  
  39.     ''' <summary>
  40.    ''' LoopStream simply returns
  41.    ''' </summary>
  42.    Public Overrides ReadOnly Property Length() As Long
  43.         Get
  44.             Return sourceStream.Length
  45.         End Get
  46.     End Property
  47.  
  48.     ''' <summary>
  49.    ''' LoopStream simply passes on positioning to source stream
  50.    ''' </summary>
  51.    Public Overrides Property Position() As Long
  52.         Get
  53.             Return sourceStream.Position
  54.         End Get
  55.         Set(value As Long)
  56.             sourceStream.Position = value
  57.         End Set
  58.     End Property
  59.  
  60.     Public Overrides Function Read(buffer As Byte(), offset As Integer, count As Integer) As Integer
  61.         Dim totalBytesRead As Integer = 0
  62.  
  63.         While totalBytesRead < count
  64.             Dim bytesRead As Integer = sourceStream.Read(buffer, offset + totalBytesRead, count - totalBytesRead)
  65.             If bytesRead = 0 Then
  66.                 If sourceStream.Position = 0 OrElse Not EnableLooping Then
  67.                     ' something wrong with the source stream
  68.                    Exit While
  69.                 End If
  70.                 ' loop
  71.                sourceStream.Position = 0
  72.             End If
  73.             totalBytesRead += bytesRead
  74.         End While
  75.         Return totalBytesRead
  76.     End Function
  77. End Class


Lo segundo es usar el código que reproduce los dos archivos.
Código vb:
Ver original
  1. Imports NAudio.Wave
  2.  
  3.  
  4. Public Class Form1
  5.  
  6.     Private sound1 As WaveOut
  7.     Private sound2 As WaveOut
  8.  
  9.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click
  10.         If sound1 Is Nothing Then
  11.             Dim reader As New WaveFileReader("media/test.wav")
  12.             Dim looping As New LoopStream(reader)
  13.             sound1 = New WaveOut()
  14.             sound1.Init(looping)
  15.             sound1.Play()
  16.     End Sub
  17.  
  18.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button3.Click
  19.         If sound2 Is Nothing Then
  20.             Dim reader As New WaveFileReader("media/test1.wav")
  21.             Dim looping As New LoopStream(reader)
  22.             sound2 = New WaveOut()
  23.             sound2.Init(looping)
  24.             sound2.Play()
  25.     End Sub
  26. End Class

Espero que te sirva.

Un saludo.
  #3 (permalink)  
Antiguo 26/05/2013, 05:28
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 15 años
Puntos: 2
Respuesta: NAudio en Visual Basic .NET

Oh sí, ¡funciona! jaja, perfecto, maravilloso.

Dices que lo encontraste en la documentación, aunque yo no encontré nada, ahora me siento un inútil buscando :P

Definitivamente solucionado, un resultado perfecto. ¡Muchísimas gracias!
  #4 (permalink)  
Antiguo 26/05/2013, 06:33
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 7 meses
Puntos: 344
Respuesta: NAudio en Visual Basic .NET

Buenas,

Lo encontre en la parte de documentación: http://naudio.codeplex.com/documentation, en el apartado "How do I ...?", subapartado "Implement Looped Playback".

El ejemplo está en C#, lo único que he hecho ha sido pasarlo a VB.NET.

Un saludo.
  #5 (permalink)  
Antiguo 26/05/2013, 07:17
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 15 años
Puntos: 2
Respuesta: NAudio en Visual Basic .NET

Añado una anotación para quien tenga también un problemilla que acabo de tener.

Para detener un sonido, y que luego pueda volver a reproducirse, usar esto:

Código vb:
Ver original
  1. If Drum Is Nothing Then
  2.             Else
  3.                 Drum.Stop()
  4.                 Drum.Dispose()
  5.                 Drum = Nothing
  6.             End If

Cambiar Drum por el nombre del sonido que sea.

Edito: Parece que este tema prefiere mantenerse lejos de estar solucionado, ahora pretendo que un sonido en concreto no se reproduzca en bucle.

Imagino que lo que debo cambiar es lo que pone entre los paréntesis de aquí: Sonido.Init(looping)
Dejarlo en blanco era demasiado fácil para funcionar.

Espero no estar haciendo mal en continuar un un tema marcado como solucionado, desde luego me precipité bastante al pulsar ese botón.

Edito 2: Ahora sí está solucionado, sólo hay que cambiar looping por reader.

Última edición por vistaero; 26/05/2013 a las 08:55

Etiquetas: basic, net, vb, visual
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 22:29.