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