Воспроизведение аудио не остановится - PullRequest
3 голосов
/ 11 мая 2010

При использовании NAudio для воспроизведения файла MP3 [в консоли] я не могу понять, как остановить воспроизведение. Когда я вызываю waveout.Stop (), код просто останавливается и waveout.Dispose () никогда не вызывается.

Это как-то связано с обратным вызовом функции? Если это так, как я могу это исправить?

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;
}

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Вы говорите, что код зависает при вызове waveOutReset? Если это так, то это известная проблема с обратными вызовами функций и определенными аудиодрайверами (SoundMAX, кажется, особенно подвержен этому). Я проверил возможное исправление исходного кода NAudio пару месяцев назад, чтобы вы могли попробовать собрать последний код и посмотреть, исправит ли это проблему.

0 голосов
/ 11 мая 2010

Мое первое предположение заключается в том, что, поскольку у вас нет вызова console.read () или аналогичного вызова, ваш код просто выполняется так быстро, что вы не видите окончательные строки записи.

Если NAudio реализует IDisposable, то я бы порекомендовал использовать оператор using, чтобы .NET справился с этим за вас.

...