2010-04-03 3 views
0

J'ai essayé d'utiliser:NAudio: Comment puis-je obtenir un événement qui me dit que le fichier MP3 a atteint la fin?

private void CreateDevice() 
{ 
    _playbackDevice = new WaveOut(); 
    _playbackDevice.PlaybackStopped += PlaybackDevicePlaybackStopped; 
} 

void PlaybackDevicePlaybackStopped(object sender, EventArgs e) 
{ 
    if (OnPlaybackStopped != null) 
    { 
     OnPlaybackStopped(this, e); 
    } 
} 

Mais il n'a jamais invoqué.

Alors j'ai essayé d'utiliser le PlaybackState en interrogeant la propriété avec une minuterie:

public PlaybackState PlaybackState 
{ 
    get 
    { 
     if (_playbackDevice == null) 
      return default(PlaybackState); 

     return _playbackDevice.PlaybackState; 
    } 
} 

Mais quand la chanson se termine, il ne change pas « arrêté ». Mais quand j'appelle manuellement Arrête ça change correctement.

Quelqu'un peut-il m'aider?

Il semble y avoir un bug ... http://naudio.codeplex.com/WorkItem/View.aspx?WorkItemId=10726

Répondre

1

Parce que NAudio est conçu pour vous permettre de faire des choses plus compliquées que simplement jouer un fichier, il ne mettra pas fin à la fin d'un fichier. Ce qui détermine si WaveOut va s'arrêter, c'est si nous arrêtons de nourrir les données ou non. Certains WaveStreams dans NAudio cessent de fournir des données lorsqu'ils ont atteint la fin d'un fichier, mais d'autres WaveStreams retourneront volontiers des tampons remplis de zéros de leur méthode Read autant de fois qu'ils sont appelés. Donc, l'auto-stop dépend beaucoup du graphique de WaveStreams que vous avez construit. Pour cette raison, vous devrez peut-être déterminer quand arrêter lorsque vous avez fini de lire le contenu du fichier à lire. Je réalise que ce n'est pas une situation idéale, et j'essaie toujours de trouver un design qui fonctionne bien à la fois pour ceux qui veulent juste jouer un seul fichier, et pour ceux qui font quelque chose d'un peu plus impliqué.

+0

Avez-vous venir avec une solution? C'est un peu gênant si l'audio continue de jouer si je l'ai rembobiné à la fin. Un événement ReachedEnd ou une propriété booléenne StopAtEnd suffirait. En fait, je préférerais arrêter de m'arrêter;) –

+0

Que jouez-vous? Si vous jouez un flux sans fin, 'PlaybackStopped' ne se déclenchera jamais. Mais si vous lisez un fichier (par exemple 'Mp3FileReader', vous vous arrêterez automatiquement à la fin) –

+0

Je joue un fichier wave en utilisant WaveOutEvent et AudioFileReader. Ce serait une bonne idée d'avoir aussi et l'événement qui est appelé quand l'état de jeu change (jouer, mettre en pause, arrêté etc.). –

0

Essayez ceci:

Dans la méthode CreateDevice, changer cette ligne:

_playbackDevice = new WaveOut(); 

par ceci:

_playbackDevice = new WaveOut(WaveCallbackInfo.FunctionCallback() 
+0

Je ne recommande pas cela. Les rappels de fonction provoquent souvent des blocages. Utilisez plutôt la classe 'WaveOutEvent' si vous n'êtes pas dans une application Windows Forms ou WPF. –

Questions connexes