Beispiel #1
0
        void ElapsedTime(object sender, EventArgs e)
        {
            var progress = Bass.StreamGetFilePosition(chan, FileStreamPosition.Buffer)
                           * 100 / Bass.StreamGetFilePosition(chan, FileStreamPosition.End); // percentage of buffer filled

            if (progress > 75 || Bass.StreamGetFilePosition(chan, FileStreamPosition.Connected) == 0)
            {
                IsPlaying = true;
                timer.Stop();                                     // finished prebuffering, stop monitoring
                var icy = Bass.ChannelGetTags(chan, TagType.ICY); // get the broadcast name and URL
                if (icy == IntPtr.Zero)
                {
                    icy = Bass.ChannelGetTags(chan, TagType.HTTP); // no ICY tags, try HTTP
                }
                if (icy != IntPtr.Zero)
                {
                    var tags = Extensions.ExtractMultiStringAnsi(icy);
                    MetadataEventArgs eventArgs = new MetadataEventArgs();
                    foreach (var tag in tags)
                    {
                        string[] items = tag.Split(new char[] { ':', '=' });
                        if (items.Length > 1)
                        {
                            eventArgs.Metadata.Add(new MetadataModel {
                                Name = items[0], Value = items[1]
                            });
                        }
                    }
                    OnMetadataChanged?.Invoke(this, eventArgs);
                }

                // get the stream title and set sync for subsequent titles
                DoMeta();

                Bass.ChannelSetSync(chan, SyncFlags.MetadataReceived, 0, MetaSync); // Shoutcast
                Bass.ChannelSetSync(chan, SyncFlags.OggChange, 0, MetaSync);        // Icecast/OGG

                // set sync for end of stream
                Bass.ChannelSetSync(chan, SyncFlags.End, 0, EndSync);

                // play it!
                Bass.ChannelPlay(chan);
            }
            else
            {
                OnMessageChanged(this, new MessageEventArgs(string.Format("Buffering... {0}%", progress), Status.Init));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Event handler for the metadata of the track being changed
        /// </summary>
        /// <param name="metaData">Metadata of the track</param>
        void HandleMetadataChanged(MLMusicService.Metadata metaData)
        {
            CurrentTrackMetadata = metaData;
            MLResult result = MLMusicService.GetMetadata(ref previousTrackMetadata, -1);

            if (!result.IsOk)
            {
                Debug.LogErrorFormat("MLMusicServiceBehavior failed to get the metadata of the previous track, disabling script. Reason: {0}.", result);
                enabled = false;
                return;
            }

            result = MLMusicService.GetMetadata(ref nextTrackMetadata, 1);
            if (!result.IsOk)
            {
                Debug.LogErrorFormat("MLMusicServiceBehavior failed to get the metadata of the next track, disabling script. Reason: {0}.", result);
                enabled = false;
                return;
            }

            OnMetadataChanged?.Invoke(metaData);
        }