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 не доступен.
}Решение задачи: «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;
}
}