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); } }
/// <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); }
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); }