NAudio: Как я могу получить событие, которое сообщит мне, что файл MP3 достиг конца? - PullRequest
1 голос
/ 03 апреля 2010

Я пытался использовать это:

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

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

Но это никогда не вызывалось.

Затем я попытался использовать PlaybackState, опросив свойство с таймером:

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

        return _playbackDevice.PlaybackState;
    }
}

Но когда песня заканчивается, она не меняется на "остановленная". Но когда я вызываю вручную Stop, он меняется правильно.

Может ли кто-нибудь мне помочь?

Кажется, есть ошибка ... http://naudio.codeplex.com/WorkItem/View.aspx?WorkItemId=10726

Ответы [ 2 ]

1 голос
/ 04 апреля 2010

Поскольку NAudio разработан, чтобы позволить вам делать более сложные вещи, чем простое воспроизведение одного файла, он не обязательно остановится в конце файла. От того, остановится ли WaveOut, зависит, прекратим ли мы передавать данные или нет. Некоторые WaveStreams в NAudio прекращают предоставлять данные, когда они достигают конца файла, но другие WaveStreams с радостью возвращают буферы, полные нулей, из их метода Read столько раз, сколько их вызывают. Поэтому автоматическая остановка во многом зависит от построенного вами графика WaveStreams.

Из-за этого вам может понадобиться определить, когда остановиться, когда вы закончили читать содержимое файла, который нужно воспроизвести. Я понимаю, что это не идеальная ситуация, и я все еще пытаюсь придумать дизайн, который хорошо работает как для тех, кто просто хочет воспроизвести один файл, так и для тех, кто делает что-то более сложное.

0 голосов
/ 29 мая 2014

Попробуйте это:

В вашем методе CreateDevice измените эту строку:

_playbackDevice = new WaveOut();

этим:

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