Beispiel #1
0
 private static void _BassCallback_EndSync(int handle, int channel, int data, IntPtr user)
 {
     if (user != IntPtr.Zero)
     {
         GCHandle      gcHandle = GCHandle.FromIntPtr(user);
         IceCastStream obj      = (IceCastStream)gcHandle.Target;
         obj.BassCallback_EndSync(handle, channel, data, Guid.Empty);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Used to bootstrap bass to start playing. It's needs some data so it can detect wat
        /// type of file it is. After that we can start using "BASS_StreamPutFileData"
        /// to push the remainder of the data to bass. This function will never be called again
        /// </summary>
        private static int _BassCallback_FileProcUserReadOut(IntPtr buffer, int length, IntPtr user)
        {
            if (user != IntPtr.Zero)
            {
                GCHandle      gcHandle = GCHandle.FromIntPtr(user);
                IceCastStream obj      = (IceCastStream)gcHandle.Target;
                return(obj.BassCallback_FileProcUserReadOut(buffer, length));
            }

            return(0);
        }
Beispiel #3
0
        private void GetHttpStream()
        {
            threadStarted = true;
            do
            {
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    request.Headers.Clear();
                    request.Headers.Add("Icy-MetaData", "1");
                    request.KeepAlive = false;
                    request.UserAgent = "VLC media player";
                    cbbChunkAudio     = new CircularBlockBuffer();
                    cbbListenAudio    = new CircularBlockBuffer();
                    inSecBuffer       = null; // buffer 1 second of pcm data which we can send then
                    inSecPtr          = 0;

                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        // get the position of metadata (if available)
                        int metaInt       = int.Parse(response.Headers["Icy-MetaInt"]);
                        int receivedBytes = 0;

                        using (Stream socketStream = response.GetResponseStream())
                        {
                            try
                            {
                                socketStream.ReadTimeout = 20 * 1000; // 20 second timeout (throws exception when time expires)
                                while (Running)
                                {
                                    byte[] buffer = new byte[16384];
                                    if (receivedBytes == metaInt)
                                    {
                                        int metaLen = socketStream.ReadByte();
                                        if (metaLen > 0)
                                        {
                                            byte[] metaInfo = new byte[metaLen * 16];
                                            int    len      = 0;
                                            while ((len += socketStream.Read(metaInfo, len, metaInfo.Length - len)) < metaInfo.Length)
                                            {
                                                ;
                                            }
                                            ParseMetaInfo(metaInfo);
                                        }
                                        receivedBytes = 0;
                                    }

                                    int bytesLeft = ((metaInt - receivedBytes) > buffer.Length) ? buffer.Length : (metaInt - receivedBytes);
                                    int result    = socketStream.Read(buffer, 0, bytesLeft);
                                    receivedBytes += result;

                                    // Doe nu wat met de data
                                    ProcessStreamData(buffer, 0, result);
                                    AudioToSpeaker(buffer, 0, result);
                                } // while running
                            }
                            finally
                            {
                                // Needed so the using call doesn't "hang" the code (http://stackoverflow.com/questions/5855088/httpwebresponse-getresponsestream-hanging-in-dispose)
                                request.Abort();
                            }
                        } //using
                    }     //using httpresponse
                }
                catch (IOException ex)
                {
                    IceCastStream.Log(this, string.Format("Handled IOException, reconnecting. Details:\n{0}\n{1}", ex.Message, ex.StackTrace));
                }
                catch (SocketException ex)
                {
                    IceCastStream.Log(this, string.Format("Handled SocketException, reconnecting. Details:\n{0}\n{1}", ex.Message, ex.StackTrace));
                }
                catch (WebException ex)
                {
                    IceCastStream.Log(this, string.Format("Handled WebException, reconnecting. Details:\n{0}\n{1}", ex.Message, ex.StackTrace));
                }
                finally
                {
                    if (inputHandle != 0)
                    {
                        Bass.BASS_StreamFree(inputHandle);
                        inputHandle = 0;
                    }
                    if (inputHandle != 0)
                    {
                        Bass.BASS_StreamFree(mixerHandle);
                        mixerHandle = 0;
                    }
                    if (listenHandle != 0)
                    {
                        Bass.BASS_ChannelStop(listenHandle);
                        Bass.BASS_StreamFree(listenHandle);
                        listenHandle = 0;
                    }


                    cbbChunkAudio  = null;
                    inSecBuffer    = null;
                    inSecPtr       = 0;
                    cbbListenAudio = null;
                    listen         = false;
                }

                // Wait 10 seconds before trying to connect again
                int countSleep = 0;
                while (Running && countSleep < 100)
                {
                    Thread.Sleep(100);
                    countSleep++;
                }
            } while (Running);
        }