Je continue d'envoyer des données à IAudioClient
(GetBufferSize/GetCurrentPadding/GetBuffer/ReleaseBuffer
), mais je veux savoir quand le périphérique audio a fini de lire les dernières données que j'ai envoyées. Je ne veux pas supposer que le lecteur s'est arrêté juste parce que j'ai envoyé la dernière partie de données à l'appareil: il pourrait encore jouer les données mises en mémoire tampon.IAudioClient - Recevoir une notification à la fin de la lecture?
J'ai essayé d'utiliser IAudioClock
/IAudioClock2
pour vérifier la position du tampon matériel, mais il reste le même à partir du moment où j'envoie le dernier segment.
Je ne vois pas aussi rien de pertinent dans les interfaces IMMNotificationClient
et IAudioSessionNotification
...
Qu'est-ce que je manque?
Merci! IMMNotificationClient et IAudioSessionNotification ne vont pas vous aider, ils sont pour détecter de nouveaux périphériques/nouvelles sessions d'application respectivement.
IAudioClock :: GetPosition/etc renvoie toujours la même valeur, que l'audio soit en cours de lecture ou non. Je peux utiliser IAudioMeterInformation.GetPeakValue et vérifier si la valeur retournée == 0. Cela semble fonctionner dans mon cas (l'audio est un enregistrement de microphone avec au moins un peu de bruit ambiant), mais je ne l'aime pas vraiment comme générique solution - on peut certainement avoir des périodes de silence dans le flux audio. –
AudioClock devrait retourner des positions en augmentation continue tant que vous n'arrêtez pas le flux. Vous avez un exemple de code qui reproduit le problème? –
Rien que je peux poster - J'ai une application Delphi qui diffuse les données (fonctionne bien), et tout en streaming, j'ai un feu de minuterie toutes les 50ms (juste un test) et appelez AudioClock :: GetPosition. Les deux valeurs renvoyées sont consignées. Ils restent les mêmes à tout moment et ne diffèrent que lorsque je réinitialise l'appareil. –