示例#1
0
        public async Task Run()
        {
            if (!IsInitialized || IsStarted || IsDisposed)
            {
                return;
            }

            IsStarted = true;

            var mmDevice    = new MMDeviceEnumerator().GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
            var wavProvider = new BufferedWaveProvider(new WaveFormat(SoundSamplingRate, 16, 1));

            var wavPlayer = new WasapiOut(mmDevice, AudioClientShareMode.Shared, false, 200);

            wavPlayer.Init(new VolumeWaveProvider16(wavProvider));
            wavPlayer.Play();

            var objBuilder = QiObjectBuilder.Create();

            objBuilder.AdvertiseMethod(
                "processRemote::v(iimm)",
                (sig, arg) =>
            {
                byte[] raw = arg[3].GetRaw();
                wavProvider.AddSamples(raw, 0, raw.Length);
                return(QiValue.Void);
            });

            var  _soundSubscriberService = objBuilder.BuildObject();
            uint _soundSubscriberId      = _session.RegisterService(SoundSubscriberServiceName, _soundSubscriberService);


            _audioDevice.Call("setClientPreferences",
                              new QiString(SoundSubscriberServiceName), new QiInt32(SoundSamplingRate), new QiInt32(3), new QiInt32(0)
                              );
            _audioDevice.Call("subscribe", new QiString(SoundSubscriberServiceName));

            await Task.Delay(-1, _cts.Token)
            .ContinueWith(_ =>
            {
                _audioDevice.Call("unsubscribe", new QiString(SoundSubscriberServiceName));
                _session.UnregisterService(_soundSubscriberId);
                wavPlayer.Stop();
                wavPlayer.Dispose();
            });
        }