Problem mit dem Deadlock von waveOutWrite und waveOutGetPosition

Ich arbeite an einer App, mit der ich kontinuierlich Audio abspielen kannwaveOut... API vonwinmm.dll. Die App verwendet "leapfrog" -Puffer, bei denen es sich im Grunde um eine Reihe von Arrays von Samples handelt, die Sie in die Audio-Warteschlange verschieben. Windows spielt sie nahtlos nacheinander ab und ruft nach Abschluss jedes Puffers eine Rückruffunktion auf. In dieser Funktion lade ich den nächsten Satz von Samples in den Puffer, verarbeite sie jedoch und lade den Puffer dann zurück in die Audio-Warteschlange. Auf diese Weise wird der Ton unbegrenzt abgespielt.

Zu Animationszwecken versuche ich zu integrierenwaveOutGetPosition in die Anwendung (da die "Buffer done" -Rückrufe unregelmäßig genug sind, um ruckelige Animationen zu verursachen).waveOutGetPosition Gibt die aktuelle Wiedergabeposition zurück, ist also hyperpräzise.

Das Problem ist, dass ich in meiner Anwendung anrufewaveOutGetPosition Lässt die Anwendung schließlich abstürzen - der Ton wird gestoppt und der Anruf wird nie zurückgegeben. Ich habe die Dinge auf eine einfache App reduziert, die das Problem demonstriert. Sie können die App hier ausführen:

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

Wenn Sie nur ein kleines Stück Klavier immer und immer wieder hören, funktioniert es. Es soll nur das Problem demonstrieren. Der Quellcode für dieses Projekt ist hier (alles Fleisch ist in LeapFrogPlayer.cs):

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

Mit der ersten Schaltfläche wird die App im Schaltmodus ausgeführt, ohne dass Anrufe an getätigt werdenwaveOutGetPosition. Wenn Sie darauf klicken, wird die App für immer ohne Unterbrechung abgespielt (die X-Taste schließt sie und schaltet sie aus). Die zweite Schaltfläche startet den Leapfrogger und startet auch einen Formulartimer, der den aufruftwaveOutGetPosition und zeigt die aktuelle Position an. Klicken Sie auf diese Schaltfläche, und die App wird für kurze Zeit ausgeführt und dann gesperrt. Bei meinem Laptop kommt es normalerweise innerhalb von 15 bis 30 Sekunden zum Absturz. höchstens eine Minute.

Ich habe keine Ahnung, wie ich das beheben kann, daher wäre jede Hilfe oder Anregung sehr willkommen. Ich habe sehr wenige Beiträge zu diesem Thema gefunden, aber es scheint, dass ein möglicher Deadlock vorliegt, entweder von mehreren Anrufen biswaveOutGetPosition oder von anrufen zu undwaveOutWrite die zur gleichen Zeit auftreten. Es ist möglich, dass ich dies zu häufig aufrufe, als dass das System es verarbeiten könnte.

Bearbeiten: vergessen zu erwähnen, ich laufe dies auf Windows Vista. Bei anderen Betriebssystemen ist dies möglicherweise überhaupt nicht der Fall.

Bearbeiten 2: Ich habe online wenig über dieses Problem herausgefunden, abgesehen von diesen (unbeantworteten) Beiträgen:

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

Bearbeiten 3: Nun, ich bin jetzt in der Lage, dieses Problem nach Belieben zu reproduzieren. Wenn ich anrufewaveOutGetPosition gleich nachwaveOutWrite (In der folgenden Codezeile) hängt die Anwendung jedes Mal. Besonders schlimm hängt es auch - es scheint mein gesamtes Betriebssystem für eine Weile zu blockieren, nicht nur die App selbst. So scheint es daswaveOutGetPosition Deadlocks, wenn es um auftrittfast zur gleichen Zeit wiewaveOutWritenicht nur buchstäblich zur gleichen Zeit, was erklären könnte, warum die Schlösser bei mir nicht funktionieren. Yeesh.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage