Bass.NET.dll Проигрывание интернет радио. Узнать, что сменились теги в потоке - C#

Узнай цену своей работы

Формулировка задачи:

DOWNLOADPROC _downloadProc_; //Делегат
int numberStream;
 
public void Play(Uri address)
{
    Bass.BASS_StreamFree(numberStream); //освобождаем поток.
    numberStream = Bass.BASS_StreamCreateURL(address.OriginalString, 0, BASSFlag.BASS_STREAM_STATUS, _downloadProc_, IntPtr.Zero); //Bass.dll создаёт поток и возвращает его номер, для дальнейшего управления потоком, по его номеру
    if (numberStream != 0) //если 0, то произошла ошибка
    {
        GetTagsFromCurrentURLStream(); //получить теги
        Bass.BASS_ChannelPlay(numberStream, true); //играем полученный поток начав сначала (второй параметр за это отвечает)
        Bass.BASS_ChannelSetAttribute(numberStream, BASSAttribute.BASS_ATTRIB_VOL, this.volume);
    }
    else
        MessageBox.Show("А-а-а, всё пропало!!!");
}
 
private void GetTagsFromCurrentURLStream()
{
    TAG_INFO tagInfo = new TAG_INFO();
    IntPtr tagsIntPtr = Bass.BASS_ChannelGetTags(numberStream, BASSTag.BASS_TAG_META);
    BassTags.BASS_TAG_GetFromURL(numberStream, tagInfo);
 
    this.TagInfo = new TagInfo(tagInfo); //TagInfo это обёртка над TAG_INFO, ничего важного для темы. Вообще код используется в dll. То есть из приложения TAG_INFO не доступен.
}
Вот методом Play можно воспроизвести интернет радиостанцию и получить информацию из тегов (это составленные для примера методы, в реале всё умней =) ). Возможно тут есть люди знакомые с этой библиотекой. Может кто нибудь подсказать, как узнавать, что сменились теги в радио потоке? То есть, чтобы я мог своевременно узнать, что на радио начала играть другая песня. Не проверять же таймером эти теги... Может есть встроенная возможность?

Решение задачи: «Bass.NET.dll Проигрывание интернет радио. Узнать, что сменились теги в потоке»

textual
Листинг программы
    public class BassPlayer
    {
        private int _handleSynchronization;
        //В методе Play() будет использоваться: _handleSynchronization = Bass.BASS_ChannelSetSync(_numberStream, BASSSync.BASS_SYNC_META, 0, _syncProcChangeTags, IntPtr.Zero);
        SYNCPROC _syncProcChangeTags; 
        SYNCPROC _syncProcEndStream;
        private int _numberStream;
 
        public BassPlayer()
        {
            _syncProcChangeTags = new SYNCPROC(SyncMethodTagsChanged); 
            _syncProcEndStream = new SYNCPROC(SyncMethodEndStream);
        }
 
        /// <summary>Происходит, когда меняются теги, при смене музыки на радиостанции</summary>
        public event EventHandler<RPTagsChangedEventArgs> TagsChanged;
        /// <summary>Происходит, когда кончается воспроизведение потока (музыкального файла). При воспроизведении радио, не срабатывает</summary>
        public event EventHandler EndStream;
 
 
        public TAG_INFO TagInfo { get; private set; }
 
 
        private void SyncMethodTagsChanged(int handle, int channel, int data, IntPtr user)
        {
            OnTagsChanged(handle, channel, data, user);
        }
 
        private void SyncMethodEndStream(int handle, int channel, int data, IntPtr user)
        {
            OnEndStream();
        }
 
        public void OnTagsChanged(int handle, int channel, int data, IntPtr user)
        {
            EventHandler<RPTagsChangedEventArgs> handler = TagsChanged;
            if (handler != null)
            {
                GetTagsFromURLStream();
                handler(this, new RPTagsChangedEventArgs(TagInfo, handle, channel, data, user));
            }
        }
 
        private void OnEndStream()
        {
            EventHandler handler = EndStream;
            if (handler != null)
                handler(this, new EventArgs());
        }
 
        /// <summary>
        /// Получить теги с текущего URL потока
        /// </summary>
        void GetTagsFromURLStream()
        {
            TAG_INFO tagInfo = new TAG_INFO();
            Bass.BASS_ChannelGetTags(_numberStream, BASSTag.BASS_TAG_META);
            BassTags.BASS_TAG_GetFromURL(_numberStream, tagInfo);
            TagInfo = tagInfo;
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.364 из 5
Похожие ответы