Problema con el punto muerto waveOutWrite y waveOutGetPosition

Estoy trabajando en una aplicación que reproduce audio continuamente usando elwaveOut... API dewinmm.dll. La aplicación utiliza buffers "leapfrog", que son básicamente un conjunto de matrices de muestras que se vuelcan en la cola de audio. Windows los reproduce sin problemas en secuencia, y a medida que cada búfer completa Windows llama a una función de devolución de llamada. Dentro de esta función, cargo el siguiente conjunto de muestras en el búfer, las proceso sin embargo y luego vuelco el búfer a la cola de audio. De esta manera, el audio se reproduce indefinidamente.

Para fines de animación, estoy tratando de incorporarwaveOutGetPosition en la aplicación (ya que las devoluciones de llamada "buffer hecho" son lo suficientemente irregulares como para causar animación desigual).waveOutGetPosition devuelve la posición actual de reproducción, por lo que es hiperprecisa.

El problema es que en mi aplicación, hacer llamadas awaveOutGetPosition finalmente hace que la aplicación se bloquee: el sonido se detiene y la llamada nunca regresa. He resumido las cosas en una aplicación simple que demuestra el problema. Puedes ejecutar la aplicación aquí:

http://www.musigenesis.com/SO/waveOut%20demo.exe

Si solo escuchas un poquito de piano una y otra vez, está funcionando. Solo pretende demostrar el problema. El código fuente de este proyecto está aquí (toda la carne está en LeapFrogPlayer.cs):

http://www.musigenesis.com/SO/WaveOutDemo.zip

El primer botón ejecuta la aplicación en modo Leapfrog sin hacer llamadas awaveOutGetPosition. Si hace clic en esto, la aplicación se reproducirá para siempre sin romperse (el botón X la cerrará y la apagará). El segundo botón inicia el leapfrogger y también inicia un temporizador de formularios que llama alwaveOutGetPosition y muestra la posición actual. Haga clic en esto y la aplicación se ejecutará por un corto tiempo y luego se bloqueará. En mi computadora portátil, generalmente se bloquea en 15-30 segundos; a lo sumo se tarda un minuto.

No tengo idea de cómo solucionar esto, por lo que cualquier ayuda o sugerencia sería bienvenida. He encontrado muy pocas publicaciones sobre este tema, pero parece que existe un posible punto muerto, ya sea por múltiples llamadas awaveOutGetPosition o de llamadas a eso ywaveOutWrite que ocurren al mismo tiempo Es posible que llame a esto con demasiada frecuencia para que el sistema lo maneje.

Editar: olvidé mencionar, estoy ejecutando esto en Windows Vista. Esto podría no suceder en absoluto en otros sistemas operativos.

Editar 2: He encontrado poco sobre este problema en línea, excepto por estas publicaciones (sin respuesta):

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/c6a1e80e-4a18-47e7-af11-56a89f638ad7

Editar 3: Bueno, ahora puedo reproducir este problema a voluntad. Si llamowaveOutGetPosition inmediatamente despueswaveOutWrite (en la siguiente línea de código) la aplicación se bloquea cada vez. También se cuelga de una manera especialmente mala: parece bloquear todo mi sistema operativo por un tiempo, no solo la aplicación en sí. Entonces parece quewaveOutGetPosition puntos muertos si ocurre encasi al mismo tiempo quewaveOutWrite, no solo literalmente al mismo tiempo, lo que podría explicar por qué las cerraduras no funcionan para mí. Yeesh

Respuestas a la pregunta(3)

Su respuesta a la pregunta