2010-05-11 9 views
2

Lorsque vous utilisez NAudio pour lire un fichier MP3 [dans la console], je n'arrive pas à déterminer comment arrêter la lecture. Quand j'appelle waveout.Stop() le code s'arrête juste de fonctionner et waveout.Dispose() n'est jamais appelé.La lecture du fichier audio ne s'arrête pas

Cela a-t-il quelque chose à voir avec le rappel de fonction? Si c'est le cas, comment puis-je le réparer?

static string MP3 = @"song.mp3"; 
static WaveOut waveout; 
static WaveStream playback; 
static void Main(string[] args) 
{ 
    waveout = new WaveOut(WaveCallbackInfo.FunctionCallback()); 
    playback = OpenMp3Stream(MP3); 
    waveout.Init(playback); 
    waveout.Play(); 
    Console.WriteLine("Started"); 

    Thread.Sleep(2 * 1000); 

    Console.WriteLine("Ending"); 
    if (waveout.PlaybackState != PlaybackState.Stopped) 
     waveout.Stop(); 
    Console.WriteLine("Stopped"); 
    waveout.Dispose(); 
    Console.WriteLine("1st dispose"); 
    playback.Dispose(); 
    Console.WriteLine("2nd dispose"); 
} 
private static WaveChannel32 OpenMp3Stream(string fileName) 
{ 
    WaveChannel32 inputStream; 
    WaveStream mp3Reader = new Mp3FileReader(fileName); 
    WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader); 
    WaveStream blockAlignedStream = new BlockAlignReductionStream(pcmStream); 
    inputStream = new WaveChannel32(blockAlignedStream); 
    return inputStream; 
} 
+0

J'ai l'impression que l'instruction 'using' serait très utile ici, mais je n'ai pas naudio donc je ne peux pas vraiment tester. –

+0

bien ceci est seulement un exemple de code, je ne pense pas que l'utilisation d'une instruction using fonctionnerait vraiment à long terme. Ce n'est pas vraiment de retour de l'appel waveout.Stop() du tout. Il entre dans la fonction et ne semble pas partir du tout. – Kurru

Répondre

2

Voulez-vous dire que le code se bloque dans l'appel à waveOutReset? Si c'est le cas, il s'agit d'un problème connu avec les callbacks de fonction et certains pilotes audio (SoundMAX semble particulièrement sensible à cela). J'ai vérifié il ya quelques mois une solution possible au code source de NAudio, de sorte que vous puissiez essayer de construire le dernier code et voir si cela résout le problème.

+0

Merci, c'était le problème. Fixe maintenant, merci: D – Kurru

+0

Awesome! Je suis content d'être tombé sur ça. J'ai eu exactement le même problème. – senfo

0

Ma première hypothèse est que puisque vous n'avez pas console.read() ou appel similaire que votre code est juste si vite que exécutait vous ne voyez pas les lignes d'écriture finales.

Si NAudio implémente IDisposable, je recommande d'utiliser une instruction using pour que .NET gère cela pour vous.

Questions connexes