/// <summary>
        /// Create a PortAudioDevicePump for an input device
        /// Note: This MUST be disposed, or you risk breaking audio on the host until the next reboot
        /// </summary>
        /// <param name="device">The input device to create a pump for</param>
        /// <param name="channelCount">The number of channels to capture from the input device</param>
        /// <param name="sampleFormat">The sample format of the output PCM data</param>
        /// <param name="suggestedLatency">The latency the device will attempt to achieve</param>
        /// <param name="sampleRate">The sample rate of the output PCM data</param>
        /// <param name="callback">The callback that will be invoked when data is produced</param>
        /// <exception cref="ArgumentNullException">Thrown in the case that the device or callback are null</exception>
        public unsafe PortAudioDevicePump(PortAudioDevice device, int channelCount, PortAudioSampleFormat sampleFormat,
                                          TimeSpan suggestedLatency, double sampleRate, WriteDataCallback callback)
        {
            if (device == null)
            {
                throw new ArgumentNullException(nameof(device));
            }
            if (callback == null)
            {
                throw new ArgumentNullException(nameof(callback));
            }

            PortAudioLifetimeRegistry.Register(this);

            SampleFormat     = sampleFormat;
            Channels         = channelCount;
            SampleRate       = sampleRate;
            SuggestedLatency = suggestedLatency;

            _handle            = GCHandle.Alloc(this);
            _isOutput          = false;
            _writeDataCallback = callback;

            var inputParams = new PaStreamParameters
            {
                ChannelCount = channelCount,
                DeviceIndex  = device.DeviceIndex,
                HostApiSpecificStreamInfo = IntPtr.Zero,
                SampleFormats             = sampleFormat.SampleFormat,
                SuggestedLatency          = new PaTime(suggestedLatency)
            };

            var err = Native.PortAudio.Pa_OpenStream(out _stream, &inputParams, null, sampleRate, FRAMES_TO_BUFFER, PaStreamFlags.NoFlag,
                                                     StreamCallback, GCHandle.ToIntPtr(_handle));

            if (err < PaErrorCode.NoError)
            {
                throw PortAudioException.GetException(err);
            }

            err = Native.PortAudio.Pa_SetStreamFinishedCallback(_stream, StreamFinishedCallback);
            if (err < PaErrorCode.NoError)
            {
                throw PortAudioException.GetException(err);
            }
        }
Example #2
0
        private void Send(
            string uri, ReceiveMode mode, WriteDataCallback wdcb, SuccessCallback scb, BinarySuccessCallback bcb,
            ErrorCallback ecb, FinishedCallback fcb)
        {
            if (!LoggedIn && uri != "/login" && uri != "/crashreport") {
                throw new InvalidOperationException("Not logged in");
            }

            var req = WebRequest.CreateHttp(((uri == "/login" || uri == "/crashreport") ? DefaultRootUrl : RootUrl) + uri);

            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";

            var waitHandle = new ManualResetEvent(false);

            req.BeginGetRequestStream(ar => {
                try {
                    using (var requestStream = req.EndGetRequestStream(ar)) {
                        using (var sr = new StreamWriter(requestStream)) {
                            wdcb(sr);
                        }
                    }

                    req.BeginGetResponse(
                        a => {
                            waitHandle.Set();

                            try {
                                var response = (HttpWebResponse) req.EndGetResponse(a);

                                var responseStream = response.GetResponseStream();

                                if (mode == ReceiveMode.Blob) {
                                    var data = new byte[response.ContentLength];

                                    responseStream.BeginRead(
                                        data,
                                        0,
                                        (int) response.ContentLength,
                                        result => {
                                            if (result.IsCompleted) {
                                                bcb(response.ContentType, data);
                                            } else {
                                                ecb("Incomplete response");
                                            }
                                        },
                                        null
                                        );
                                } else {
                                    using (var sr = new StreamReader(responseStream)) {
                                        switch (mode) {
                                            case ReceiveMode.Lines:
                                                string line;

                                                while ((line = sr.ReadLine()) != null) {
                                                    if (line != string.Empty) {
                                                        scb(line);
                                                    }
                                                }

                                                break;
                                            case ReceiveMode.SingleString:
                                                scb(sr.ReadToEnd());

                                                break;
                                        }

                                        if (fcb != null) {
                                            fcb();
                                        }
                                    }
                                }
                            } catch (WebException e) {
                                if(e.Status == WebExceptionStatus.RequestCanceled) {
                                    ecb("");
                                    return;
                                }

                                var response = (HttpWebResponse) e.Response;

                                if (response.StatusCode == HttpStatusCode.Forbidden) {
                                    LoggedIn = false;
                                }

                                try {
                                    using (var responseStream = response.GetResponseStream()) {
                                        using (var sr = new StreamReader(responseStream)) {
                                            ecb(sr.ReadToEnd());
                                        }
                                    }
                                } catch (Exception ex) {
                                    // What is wrong with this platform?!
                                    ecb(ex.Message + "\n" + e.Message);
                                }
                            }
                        }, null
                    );
                } catch(WebException) {
                    // The request was aborted
                    ecb("");
                }
            }, null);

            ThreadPool.QueueUserWorkItem(
                state => {
                    if (!waitHandle.WaitOne(MessageTimeout)) {
                        (state as HttpWebRequest).Abort();
                    }
                },
                req
            );
        }
Example #3
0
        private void RequestData(string url, RequestType type, WriteDataCallback write, SuccessfulCallback success, ErrorCallback error)
        {
            try
            {
                //Prevent caching by adding the datetime. WP y u so dum...
                var request = WebRequest.CreateHttp(BaseUrl + url + "&nocache=" + DateTime.Now.Ticks.ToString());

                if (type == RequestType.POST)
                {
                    request.Method      = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                }
                else
                {
                    request.Method = "GET";
                }
                request.CookieContainer = _cookies;
                request.UserAgent       = request.UserAgent;

                if (type == RequestType.POST)
                {
                    request.BeginGetRequestStream(cb =>
                    {
                        using (var sr = new StreamWriter(request.EndGetRequestStream(cb)))
                        {
                            write(sr);
                        }

                        request.BeginGetResponse(
                            a =>
                        {
                            try
                            {
                                var response = (HttpWebResponse)request.EndGetResponse(a);

                                var responseStream = response.GetResponseStream();
                                using (var sr = new StreamReader(responseStream))
                                {
                                    success(sr.ReadToEnd());
                                }
                            }
                            catch (WebException ex)
                            {
                                error("Web exception", ex);
                            }
                        }, null);
                    }, null);
                }
                else
                {
                    request.BeginGetResponse(
                        a =>
                    {
                        try
                        {
                            var response = (HttpWebResponse)request.EndGetResponse(a);

                            var responseStream = response.GetResponseStream();
                            using (var sr = new StreamReader(responseStream))
                            {
                                string result = sr.ReadToEnd();
                                success(result);
                            }
                        }
                        catch (WebException ex)
                        {
                            error("GET exception", ex);
                        }
                    }, null);
                }
            }
            catch (WebException ex)
            {
                error("Web exception", ex);
            }
        }
Example #4
0
        private void Send(
            string uri, ReceiveMode mode, WriteDataCallback wdcb, SuccessCallback scb, BinarySuccessCallback bcb,
            ErrorCallback ecb, FinishedCallback fcb)
        {
            if (!LoggedIn && uri != "/login" && uri != "/crashreport")
            {
                throw new InvalidOperationException("Not logged in");
            }

            var req = WebRequest.CreateHttp(((uri == "/login" || uri == "/crashreport") ? DefaultRootUrl : RootUrl) + uri);

            req.ContentType = "application/x-www-form-urlencoded";
            req.Method      = "POST";

            var waitHandle = new ManualResetEvent(false);

            req.BeginGetRequestStream(ar => {
                try {
                    using (var requestStream = req.EndGetRequestStream(ar)) {
                        using (var sr = new StreamWriter(requestStream)) {
                            wdcb(sr);
                        }
                    }

                    req.BeginGetResponse(
                        a => {
                        waitHandle.Set();

                        try {
                            var response = (HttpWebResponse)req.EndGetResponse(a);

                            var responseStream = response.GetResponseStream();

                            if (mode == ReceiveMode.Blob)
                            {
                                var data = new byte[response.ContentLength];

                                responseStream.BeginRead(
                                    data,
                                    0,
                                    (int)response.ContentLength,
                                    result => {
                                    if (result.IsCompleted)
                                    {
                                        bcb(response.ContentType, data);
                                    }
                                    else
                                    {
                                        ecb("Incomplete response");
                                    }
                                },
                                    null
                                    );
                            }
                            else
                            {
                                using (var sr = new StreamReader(responseStream)) {
                                    switch (mode)
                                    {
                                    case ReceiveMode.Lines:
                                        string line;

                                        while ((line = sr.ReadLine()) != null)
                                        {
                                            if (line != string.Empty)
                                            {
                                                scb(line);
                                            }
                                        }

                                        break;

                                    case ReceiveMode.SingleString:
                                        scb(sr.ReadToEnd());

                                        break;
                                    }

                                    if (fcb != null)
                                    {
                                        fcb();
                                    }
                                }
                            }
                        } catch (WebException e) {
                            if (e.Status == WebExceptionStatus.RequestCanceled)
                            {
                                ecb("");
                                return;
                            }

                            var response = (HttpWebResponse)e.Response;

                            if (response.StatusCode == HttpStatusCode.Forbidden)
                            {
                                LoggedIn = false;
                            }

                            try {
                                using (var responseStream = response.GetResponseStream()) {
                                    using (var sr = new StreamReader(responseStream)) {
                                        ecb(sr.ReadToEnd());
                                    }
                                }
                            } catch (Exception ex) {
                                // What is wrong with this platform?!
                                ecb(ex.Message + "\n" + e.Message);
                            }
                        }
                    }, null
                        );
                } catch (WebException) {
                    // The request was aborted
                    ecb("");
                }
            }, null);

            ThreadPool.QueueUserWorkItem(
                state => {
                if (!waitHandle.WaitOne(MessageTimeout))
                {
                    (state as HttpWebRequest).Abort();
                }
            },
                req
                );
        }