Асинхронное копирование аудиопотока в wp7 - PullRequest
1 голос
/ 22 февраля 2012

У меня есть работающий аудиоплеер, реализованный в WP7, который подключает аудиопоток к сети с помощью HttpWebRequest и использует AudioStreamingAgent и MediaStreamSource для воспроизведения его в фоновом режиме.

Код для извлечения потока следующий:

public class AudioTrackStreamer : AudioStreamingAgent 
{
    protected override void OnBeginStreaming(AudioTrack track, AudioStreamer streamer)
    {
        stream = GetDownloadStream(track.Tag);

        // Use sine wave audio generator to simulate a streaming audio feed
        BackgroundMp3MediaStreamSource mss = new BackgroundMp3MediaStreamSource(stream);

        // Event handler for when a track is complete or the user switches tracks
        mss.StreamingCompleted += new EventHandler(mss_StreamingCompleted);

        // Set the source
        streamer.SetSource((MediaStreamSource) mss);
    }
}

Мне нужно изменить клиента, чтобы получить поток AES и декодировать его перед воспроизведением.

Хотя я мог бы создать декодированный поток и передать его в BackgroundMp3MediaStreamSource,Что-то вроде:

...
stream = GetDownloadStream(track.Tag);
decodedStream = GetDecodedStream(stream);
BackgroundMp3MediaStreamSource mss = new BackgroundMp3MediaStreamSource(decodedStream);
...


private Stream GetDecodedStream(Stream encoded) {
    Stream destination = new MemoryStream();
    BackgroundWorker streamCopier = new BackgroundWorker();
    streamCopier.DoWork += (o, e) => StreamCopierDoWork(encoded, destination);
    streamCopier.RunWorkerAsync();

    return new NonUiStreamer(destination);
}

private static void StreamCopierDoWork(Stream encoded, Stream destination) {
    const int chunk = 1 * 1024;

    var buffer = new byte[chunk];

    AsyncCallback rc = null;
    rc = readResult => {
        int read = encoded.EndRead(readResult);
        if (read > 0) {
            destination.BeginWrite(buffer, 0, read, writeResult => {
                    destination.EndWrite(writeResult);
                    encoded.BeginRead(buffer, 0, buffer.Length, rc, null);
            }, null);
        }
    };
    encoded.BeginRead(buffer, 0, chunk, rc, null);
}

Примечание : Я пока не декодирую поток.Просто скопируйте его асинхронно в другой поток, чтобы увидеть, все ли работает.

Но когда я пытаюсь прочитать первые байты декодированного потока decodedStream.Read(data, 0, 3);, возвращается 0 байтов.

Почему не получаетсяЯ читаю декодированный поток?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...