Tengo un proyecto de C# que reproduce código Morse para fuentes RSS. Lo escribo usando Managed DirectX, solo para descubrir que Managed DirectX es viejo y obsoleto. La tarea que tengo es reproducir ráfagas de onda sinusoidal pura intercaladas con períodos de silencio (el código) que están cronometrados con precisión en cuanto a su duración. Necesito poder llamar a una función que reproduce un tono puro durante tantos milisegundos, luego Thread.Sleep() y luego reproducir otro, etc. En su forma más rápida, los tonos y espacios pueden ser tan cortos como 40 ms.¿Cómo producir un tono y silencio con precisión de tiempo?
Funciona bastante bien en Managed DirectX. Para obtener el tono preciso y preciso, creo 1 seg. de onda sinusoidal en una memoria intermedia secundaria, luego, para reproducir un tono de cierta duración, busco dentro de x milisegundos del final de la memoria intermedia y luego juego.
He intentado System.Media.SoundPlayer. Es un perdedor [Editar - vea mi respuesta a continuación] porque tiene que Reproducir(), Reposo(), luego Detener() para longitudes de tono arbitrarias. El resultado es un tono que es demasiado largo, variable según la carga de la CPU. Se necesita una cantidad de tiempo indeterminada para detener el tono.
Luego me embarqué en un intento largo intento de usar NAudio 1.3. Terminé con una secuencia residente en la memoria que proporciona los datos de tono, y de nuevo buscando dejar la longitud deseada de tono restante en la transmisión, y luego reproducir. Esto funcionó bien en la clase DirectSoundOut por un tiempo (ver a continuación) pero la clase WaveOut muere rápidamente con una afirmación interna que dice que los búferes todavía están en la cola a pesar de PlayerStopped = true. Esto es extraño ya que toco hasta el final y pongo una espera de la misma duración entre el final del tono y el inicio del siguiente. Pensarías que 80 ms después de iniciar Play de un tono de 40 ms no tendría buffers en la cola.
DirectSoundOut funciona bien por un tiempo, pero su problema es que por cada reproducción de tono Play() produce un hilo separado. Eventualmente (5 minutos más o menos) simplemente deja de funcionar. Puede ver el hilo después del hilo después de salir del hilo en la ventana de Salida mientras ejecuta el proyecto en VS2008 IDE. No creo objetos nuevos durante la reproducción, simplemente busco() la secuencia de tonos y luego llamo a Play() una y otra vez, así que no creo que sea un problema con los buffers huérfanos/lo que sea que se acumulen hasta que se ahogue.
No tengo paciencia con esto, así que estoy esperando con la esperanza de que alguien aquí haya enfrentado un requisito similar y pueda orientarme en una dirección con una solución probable.
Acabo de editar ligeramente la publicación y ya tiene 4 votos? Guau. –
Es una aplicación interesante, y usted hace algunas buenas preguntas. Así que sí, upvote. –
Si lo tiene funcionando en Managed DirectX (MDX) ¿por qué es un problema que ya no sea compatible con Microsoft? El hecho de que no sea compatible no significa que no pueda usarlo. Cualquier máquina que tenga .NET 2 y DirectX 9 instalado debería continuar ejecutando aplicaciones MDX sin problemas. – Ash