Beispiel #1
0
// update stream title from metadata
void DoMeta()
{
	const char *meta=BASS_ChannelGetTags(chan,BASS_TAG_META);
	if (meta) { // got Shoutcast metadata
		char *p=strstr(meta,"StreamTitle='");
		if (p) {
			p=strdup(p+13);
			strchr(p,';')[-1]=0;
			SetStaticText(30,p);
			free(p);
		}
	} else {
		meta=BASS_ChannelGetTags(chan,BASS_TAG_OGG);
		if (meta) { // got Icecast/OGG tags
			const char *artist=NULL,*title=NULL,*p=meta;
			for (;*p;p+=strlen(p)+1) {
				if (!strncasecmp(p,"artist=",7)) // found the artist
					artist=p+7;
				if (!strncasecmp(p,"title=",6)) // found the title
					title=p+6;
			}
			if (title) {
				if (artist) {
					char text[100];
					snprintf(text,sizeof(text),"%s - %s",artist,title);
					SetStaticText(30,text);
				} else
					SetStaticText(30,title);
			}
		}
    }
}
Beispiel #2
0
gboolean PrebufTimerProc(gpointer data)
{ // monitor prebuffering progress
	DWORD progress=BASS_StreamGetFilePosition(chan,BASS_FILEPOS_BUFFER)
		*100/BASS_StreamGetFilePosition(chan,BASS_FILEPOS_END); // percentage of buffer filled
	if (progress>75 || !BASS_StreamGetFilePosition(chan,BASS_FILEPOS_CONNECTED)) { // over 75% full (or end of download)
		{ // get the broadcast name and URL
			const char *icy=BASS_ChannelGetTags(chan,BASS_TAG_ICY);
			if (!icy) icy=BASS_ChannelGetTags(chan,BASS_TAG_HTTP); // no ICY tags, try HTTP
			if (icy) {
				for (;*icy;icy+=strlen(icy)+1) {
					if (!strncasecmp(icy,"icy-name:",9))
						gtk_label_set_text_8859(GTK_LABEL(GetWidget("status2")),icy+9);
					if (!strncasecmp(icy,"icy-url:",8))
						gtk_label_set_text_8859(GTK_LABEL(GetWidget("status3")),icy+8);
				}
			} else
				gtk_label_set_text(GTK_LABEL(GetWidget("status2")),"");
		}
		// get the stream title and set sync for subsequent titles
		DoMeta();
		BASS_ChannelSetSync(chan,BASS_SYNC_META,0,&MetaSync,0); // Shoutcast
		BASS_ChannelSetSync(chan,BASS_SYNC_OGG_CHANGE,0,&MetaSync,0); // Icecast/OGG
		// set sync for end of stream
		BASS_ChannelSetSync(chan,BASS_SYNC_END,0,&EndSync,0);
		// play it!
		BASS_ChannelPlay(chan,FALSE);
		return FALSE; // stop monitoring
	} else {
		char text[20];
		sprintf(text,"buffering... %d%%",progress);
		gtk_label_set_text(GTK_LABEL(GetWidget("status2")),text);
		return TRUE; // continue monitoring
	}
}
Beispiel #3
0
// update stream title from metadata
void DoMeta()
{
	GtkLabel *label=GTK_LABEL(GetWidget("status1"));
	const char *meta=BASS_ChannelGetTags(chan,BASS_TAG_META);
	if (meta) { // got Shoutcast metadata
		char *p=strstr(meta,"StreamTitle='");
		if (p) {
			p=strdup(p+13);
			strchr(p,';')[-1]=0;
			gtk_label_set_text_8859(label,p);
			free(p);
		}
	} else {
		meta=BASS_ChannelGetTags(chan,BASS_TAG_OGG);
		if (meta) { // got Icecast/OGG tags
			const char *artist=NULL,*title=NULL,*p=meta;
			for (;*p;p+=strlen(p)+1) {
				if (!strncasecmp(p,"artist=",7)) // found the artist
					artist=p+7;
				if (!strncasecmp(p,"title=",6)) // found the title
					title=p+6;
			}
			if (title) {
				if (artist) {
					char text[100];
					snprintf(text,sizeof(text),"%s - %s",artist,title);
					gtk_label_set_text(label,text);
				} else
					gtk_label_set_text(label,title);
			}
		}
    }
}
static void doMeta() {
    const char *meta = BASS_ChannelGetTags(chan, BASS_TAG_META);
    if (meta) {
        const char *p = strstr(meta, "StreamTitle='");
        if (p) {
            char *p2 = _strdup(p + 13);
            strchr(p2, ';')[-1] = 0;
            // TODO: do something to report p2 to the user
            free(p2);
        }
    } else {
        meta = BASS_ChannelGetTags(chan, BASS_TAG_OGG);
        if (meta) {
            const char *artist=NULL, *title=NULL, *p=meta;
            for (; *p; p+=strlen(p)+1) {
                if (!_strnicmp(p,"artist=",7)) // found the artist
                    artist=p+7;
                if (!_strnicmp(p,"title=",6)) // found the title
                    title=p+6;
            }
            if (artist) {
                char text[100];
                _snprintf_s(text,sizeof(text),"%s - %s",artist,title);
                // TODO: report text to user
            } else if (title) {
                // TODO: report title to user
            }
        }
    }
}
Beispiel #5
0
bool Player::PrebufTimerProc()
{
        QWORD progress = BASS_StreamGetFilePosition(stream,BASS_FILEPOS_BUFFER)*100/BASS_StreamGetFilePosition(stream,BASS_FILEPOS_END);

        if (progress>75 || !BASS_StreamGetFilePosition(stream,BASS_FILEPOS_CONNECTED)) { // over 75% full (or end of download)
                { // get the broadcast name and URL
                        const char *icy=BASS_ChannelGetTags(stream,BASS_TAG_ICY);
                        if (!icy) icy=BASS_ChannelGetTags(stream,BASS_TAG_HTTP); // no ICY tags, try HTTP
                        if (icy) {

                        }
                }
                // get the stream title and set sync for subsequent titles
                //DoMeta();
                //BASS_ChannelSetSync(chan,BASS_SYNC_META,0,&MetaSync,0); // Shoutcast
                //BASS_ChannelSetSync(chan,BASS_SYNC_OGG_CHANGE,0,&MetaSync,0); // Icecast/OGG
                // set sync for end of stream
                //BASS_ChannelSetSync(chan,BASS_SYNC_END,0,&EndSync,0);
                // play it!
                BASS_ChannelPlay(stream,FALSE);

                return FALSE; // stop monitoring
        } else {
                return TRUE; // continue monitoring
        }
}
Beispiel #6
0
pascal void PrebufTimerProc(EventLoopTimerRef inTimer, void *inUserData)
{ // monitor prebuffering progress
	DWORD progress=BASS_StreamGetFilePosition(chan,BASS_FILEPOS_BUFFER)
		*100/BASS_StreamGetFilePosition(chan,BASS_FILEPOS_END); // percentage of buffer filled
	if (progress>75 || !BASS_StreamGetFilePosition(chan,BASS_FILEPOS_CONNECTED)) { // over 75% full (or end of download)
		RemoveEventLoopTimer(prebuftimer); // finished prebuffering, stop monitoring
		{ // get the broadcast name and URL
			const char *icy=BASS_ChannelGetTags(chan,BASS_TAG_ICY);
			if (!icy) icy=BASS_ChannelGetTags(chan,BASS_TAG_HTTP); // no ICY tags, try HTTP
			if (icy) {
				for (;*icy;icy+=strlen(icy)+1) {
					if (!strncasecmp(icy,"icy-name:",9))
						SetStaticText(31,icy+9);
					if (!strncasecmp(icy,"icy-url:",8))
						SetStaticText(32,icy+8);
				}
			} else
				SetStaticText(31,"");
		}
		// get the stream title and set sync for subsequent titles
		DoMeta();
		BASS_ChannelSetSync(chan,BASS_SYNC_META,0,&MetaSync,0); // Shoutcast
		BASS_ChannelSetSync(chan,BASS_SYNC_OGG_CHANGE,0,&MetaSync,0); // Icecast/OGG
		// set sync for end of stream
		BASS_ChannelSetSync(chan,BASS_SYNC_END,0,&EndSync,0);
		// play it!
		BASS_ChannelPlay(chan,FALSE);
	} else {
		char text[20];
		sprintf(text,"buffering... %d%%",progress);
		SetStaticText(31,text);
	}
}
Beispiel #7
0
void Player::play(QString stationId) {

    stop();
    if( !playList.contains(stationId))
    {
        return;
    }

    HSTREAM stream = BASS_StreamCreateURL(playList.value(stationId).toStdString().c_str(),0,BASS_STREAM_BLOCK|BASS_STREAM_STATUS|BASS_STREAM_AUTOFREE,MyDownload,0);

    BASS_Start();

    if( stream)
    {
        bool buffering = true;
        while(buffering)
        {
            QWORD progress = BASS_StreamGetFilePosition(stream,BASS_FILEPOS_BUFFER)*100/BASS_StreamGetFilePosition(stream,BASS_FILEPOS_END);
            webView()->page()->mainFrame()->evaluateJavaScript(QString("PlayerHud.updateBufforStatus("+ QString::number(progress) +")"));
            if( progress>=100)
            {
                buffering = false;
                webView()->page()->mainFrame()->evaluateJavaScript("PlayerHud.clearBufforStatus()");
            }

        }
        const char *meta=BASS_ChannelGetTags(stream,BASS_TAG_META);
        if( !meta)
        {
            meta = BASS_ChannelGetTags(stream,BASS_TAG_OGG);
        }
        if( meta)
        {
            qDebug() << meta;
            QRegularExpression rx("StreamTitle='(.+)';StreamUrl");
            QRegularExpressionMatch match = rx.match(QString(meta));
            if (match.hasMatch()) {
                qDebug() << match.captured(1);
                webView()->page()->mainFrame()->evaluateJavaScript("setRadiostationTag('"+ match.captured(1) +"')");
            }
        }
        BASS_ChannelPlay(stream,FALSE);
        playStatus = true;

    }
    else
    {
        qDebug() << BASS_ErrorGetCode();
        return;
    }
    return;
}
Beispiel #8
0
bool BassDecoder::decodeOGGTag(){
  char* tags=const_cast<char*>(BASS_ChannelGetTags(_music, BASS_TAG_OGG));
  string_t field;
  string_t value;
  if (tags) {
    while (*tags) {
      unsigned int size=strlen(tags);
      if (OggVorbisFileDecoder::splitComment(tags,size,field,value))
      {
#ifdef STRING_T_IS_SF_STRING
        sf::String::Iterator it;
        for (it=field.begin(); it !=field.end(); it++)
        {
          *it=toupper(*it);
        }
#endif
        if (field==string_t("TITLE"))
        {
          setName(value);
          return true;
        }
        else if (field==string_t("ARTIST"))
        {
          setAuthor(value);
          return true;
        }
      }
      tags+=strlen(tags)+1;
    }
  }
  return false;
}
Beispiel #9
0
// translate a CTYPE value to text
const char *GetCTypeString(DWORD ctype, HPLUGIN plugin)
{
	if (plugin) { // using a plugin
		const BASS_PLUGININFO *pinfo=BASS_PluginGetInfo(plugin); // get plugin info
		int a;
		for (a=0;a<pinfo->formatc;a++) {
			if (pinfo->formats[a].ctype==ctype) // found a "ctype" match...
				return pinfo->formats[a].name; // return it's name
		}
	}
	// check built-in stream formats...
	if (ctype==BASS_CTYPE_STREAM_OGG) return "Ogg Vorbis";
	if (ctype==BASS_CTYPE_STREAM_MP1) return "MPEG layer 1";
	if (ctype==BASS_CTYPE_STREAM_MP2) return "MPEG layer 2";
	if (ctype==BASS_CTYPE_STREAM_MP3) return "MPEG layer 3";
	if (ctype==BASS_CTYPE_STREAM_AIFF) return "Audio IFF";
	if (ctype==BASS_CTYPE_STREAM_WAV_PCM) return "PCM WAVE";
	if (ctype==BASS_CTYPE_STREAM_WAV_FLOAT) return "Floating-point WAVE";
	if (ctype&BASS_CTYPE_STREAM_WAV) return "WAVE";
	if (ctype==BASS_CTYPE_STREAM_CA) { // CoreAudio codec
		static char buf[100];
		const TAG_CA_CODEC *codec=(TAG_CA_CODEC*)BASS_ChannelGetTags(chan,BASS_TAG_CA_CODEC); // get codec info
		snprintf(buf,sizeof(buf),"CoreAudio: %s",codec->name);
		return buf;
	}
	return "?";
}
Beispiel #10
0
// translate a CTYPE value to text
const char *GetCTypeString(DWORD ctype, HPLUGIN plugin)
{
	if (plugin) { // using a plugin
		const BASS_PLUGININFO *pinfo=BASS_PluginGetInfo(plugin); // get plugin info
		int a;
		for (a=0;a<pinfo->formatc;a++) {
			if (pinfo->formats[a].ctype==ctype) // found a "ctype" match...
				return pinfo->formats[a].name; // return it's name
		}
	}
	// check built-in stream formats...
	if (ctype==BASS_CTYPE_STREAM_OGG) return "Ogg Vorbis";
	if (ctype==BASS_CTYPE_STREAM_MP1) return "MPEG layer 1";
	if (ctype==BASS_CTYPE_STREAM_MP2) return "MPEG layer 2";
	if (ctype==BASS_CTYPE_STREAM_MP3) return "MPEG layer 3";
	if (ctype==BASS_CTYPE_STREAM_AIFF) return "Audio IFF";
	if (ctype==BASS_CTYPE_STREAM_WAV_PCM) return "PCM WAVE";
	if (ctype==BASS_CTYPE_STREAM_WAV_FLOAT) return "Floating-point WAVE";
	if (ctype==BASS_CTYPE_STREAM_MF) { // a Media Foundation codec, check the format...
		const WAVEFORMATEX *wf=(WAVEFORMATEX*)BASS_ChannelGetTags(chan,BASS_TAG_WAVEFORMAT);
		if (wf->wFormatTag==0x1610) return "Advanced Audio Coding";
		if (wf->wFormatTag==0x0161 || wf->wFormatTag==0x0162 || wf->wFormatTag==0x0163) return "Windows Media Audio";
	}
	if (ctype&BASS_CTYPE_STREAM_WAV) // other WAVE codec, could use acmFormatTagDetails to get its name, but...
		return "WAVE";
	return "?";
}
Beispiel #11
0
void CClientSound::ShowShoutcastMetaTags( void )
{
    if ( m_pSound )
    {
        const char* szMeta = BASS_ChannelGetTags( m_pSound, BASS_TAG_META );
        g_pCore->GetConsole()->Printf ( "BASS ERROR %d in ShowShoutcastMetaTags  MetaTags = %s", BASS_ErrorGetCode(), szMeta );
    }
}
Beispiel #12
0
bool BassDecoder::decodeID3v2(){
  const char* tags=BASS_ChannelGetTags(_music, BASS_TAG_ID3V2);
  if (tags) {
    unsigned int offset=0;
    offset+= 3 + 2 ; //go to flags
    bool have_extended = (tags[offset] & (1 << 6));
  }
  return false;
}
Beispiel #13
0
tag_reader* reader_wma( DWORD handle )
{
	if (HIWORD(BASS_GetVersion())<0x204)
		return new reader( handle );

	return new preproc_reader( 
		BASS_ChannelGetTags( handle, BASS_TAG_WMA ),
		"WMA: bad tag format", remap, SIZE_OF_ARRAY(remap), '=', 0 );
}
// returns true when buffering is done
bool net_radio_updateBuffering() {
    QWORD progress=BASS_StreamGetFilePosition(chan,BASS_FILEPOS_BUFFER)
                   *100/BASS_StreamGetFilePosition(chan,BASS_FILEPOS_END); // percentage of buffer filled
    if (progress>75 || !BASS_StreamGetFilePosition(chan,BASS_FILEPOS_CONNECTED)) { // over 75% full (or end of download)
        KillTimer(win,0); // finished prebuffering, stop monitoring
        {   // get the broadcast name and URL
            const char *icy=BASS_ChannelGetTags(chan,BASS_TAG_ICY);
            if (!icy) icy=BASS_ChannelGetTags(chan,BASS_TAG_HTTP); // no ICY tags, try HTTP
            if (icy) {
                for (; *icy; icy+=strlen(icy)+1) {
                    if (!_strnicmp(icy,"icy-name:",9)) {
                        //MESS(31,WM_SETTEXT,0,icy+9);
                        // TODO pass this text to user
                    }
                    if (!_strnicmp(icy,"icy-url:",8)) {
                        //MESS(32,WM_SETTEXT,0,icy+8);
                        // TODO pass this text to user
                    }
                }
            } else {
                //MESS(31,WM_SETTEXT,0,"");
                // TODO pass this text to user
            }
        }
        // get the stream title and set sync for subsequent titles
        doMeta();
        BASS_ChannelSetSync(chan,BASS_SYNC_META,0,&metaSync,0); // Shoutcast
        BASS_ChannelSetSync(chan,BASS_SYNC_OGG_CHANGE,0,&metaSync,0); // Icecast/OGG
        // set sync for end of stream
        BASS_ChannelSetSync(chan,BASS_SYNC_END,0,&endSync,0);
        // play it!
        BASS_ChannelPlay(chan,FALSE);
        // done buffering, so return true
        return true;
    } else {
        char text[20];
        sprintf_s(text,"buffering... %d%%",progress);
        // TODO tell the user 'text' how much has buffered

        // not finished buffering, so return false
        return false;
    }
}
Beispiel #15
0
void getInfo(int info) {
    TAG_ID3 *tag = (TAG_ID3*) BASS_ChannelGetTags(stream, BASS_TAG_ID3);
    printf("Title : \t%s\n", tag->title);
    if (info == 0) {
        printf("Artist : \t%s\n", tag->artist);
        printf("Album : \t%s\n", tag->album);
        printf("Year : \t%s\n", tag->year);
    }
    return;
}
Beispiel #16
0
HSTREAM CBassMusicEngine::LoadFile( LPCTSTR lpszFileName )
{
	tagMusicInfo _Info;
	ZeroMemory(&_Info,sizeof _Info);

	if (!(_Info.hStream = BASS_StreamCreateFile(FALSE, lpszFileName,0,0,BASS_SAMPLE_MONO)))
	{
		ShowError(TEXT("不能打开该文件"));
		return -1;
	}

	_Info.dwTime = BASS_ChannelBytes2Seconds(_Info.hStream,BASS_ChannelGetLength(_Info.hStream,BASS_POS_BYTE) );

	TAG_ID3 *pTag = (TAG_ID3 *)BASS_ChannelGetTags(_Info.hStream,BASS_TAG_ID3);
	if ( pTag != NULL )
	{
#ifdef UNICODE
		MultiByteToWideChar(CP_ACP, 0, pTag->artist, -1, _Info.szArtist, 30);
		MultiByteToWideChar(CP_ACP, 0, pTag->title, -1, _Info.szTitle, 30);

		if ( lstrlen(_Info.szArtist) == 0 )
		{
			lstrcpyn(_Info.szArtist,TEXT("未知"),CountArray(_Info.szArtist));
		}

		if ( lstrlen(_Info.szTitle) == 0 )
		{
			CString StrTitle(lpszFileName);

			StrTitle = StrTitle.Right(StrTitle.GetLength()-StrTitle.ReverseFind('\\')-1);
			StrTitle = StrTitle.Left(StrTitle.Find('.'));
			lstrcpyn(_Info.szTitle,StrTitle,CountArray(_Info.szTitle));
		}
#else
		lstrcpyn(_Info.szArtist,CString(pTag->artist),CountArray(_Info.szArtist));
		lstrcpyn(_Info.szTitle,CString(pTag->title),CountArray(_Info.szTitle));
#endif
	}
	else
	{
		CString StrTitle(lpszFileName);

		StrTitle = StrTitle.Right(StrTitle.GetLength()-StrTitle.ReverseFind('\\')-1);
		StrTitle = StrTitle.Left(StrTitle.Find('.'));

		lstrcpyn(_Info.szArtist,TEXT("未知"),CountArray(_Info.szArtist));
		lstrcpyn(_Info.szTitle,StrTitle,CountArray(_Info.szTitle));
	}

	m_MusicEngineMap.insert(pair<HSTREAM,tagMusicInfo>(_Info.hStream,_Info));

	//Play(_Info.hStream);

	return _Info.hStream;
}
/*
	Добавление песни в плейлист
*/
VOID DlgPlayList::addSongToPlayList(HSTREAM stream, TCHAR* path)
{
	TAG_ID3* id3 = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);		//получение данных о песне
	std::wstringstream infoAboutTheSong;									//Буфер строки (Название песни + Исполнитель + время)
	infoSong info;					
	QWORD lengthSong = BASS_ChannelGetLength(stream, BASS_POS_BYTE);		//длина песни в байтах
	INT seconds = BASS_ChannelBytes2Seconds(stream, lengthSong);			//длина песни в секундах
	INT min = seconds / 60;													//Определение минут
	seconds = seconds % 60;							//Определение секунд
	/*
		Заполнение данных о песне
	*/
	if (id3 == NULL || strlen(id3->artist) == 0)
	{
		INT idx = lstrlen(path);
		INT length = idx;
		TCHAR name[MAX_PATH];
		INT k = 0;
		while (path[idx] != '\\')
		{
			idx--;
		}
		for (INT i = idx + 1; i < length;i++)
		{
			name[k] = path[i];
			k++;
		}
		name[k - 4] = '\0';					//Удаление формата песни
		infoAboutTheSong << name << "               ";
	}
	else
	{
		strcpy(info.title, id3->title);							//Name
		strcpy(info.artist, id3->artist);						//Author
		strcpy(info.album, id3->album);							//Album
		strcpy(info.year, id3->year);							//Year
		infoAboutTheSong << info.artist << " "
			<< info.title << "               ";
	}
	info.minutes = min;														//Minutes
	info.seconds = seconds;													//Seconds
	info.hStream = stream;													//Stream
	lstrcpy(info.path, path);												//Path of the song
	/*
		Запись времени песни в строку
	*/
	infoAboutTheSong << info.minutes << ":";
	if (seconds < 10)
		infoAboutTheSong << "0" << info.seconds;
	else
		infoAboutTheSong << info.seconds;
	ListBox_AddString(hPlayList, infoAboutTheSong.str().c_str());			//Add in PlayList
	songs.push_back(info);													//Add in vector
}
Beispiel #18
0
bool BassDecoder::decodeID3v1()
{
  const char* tags=BASS_ChannelGetTags(_music, BASS_TAG_ID3);
  if (tags) {
    TAG_ID3 *id3=(TAG_ID3*)tags;
    char buf[31]={0};
    sprintf(buf,"%.30s",id3->title);
    setName(string_t(buf));
    sprintf(buf,"%.30s",id3->artist);
    setAuthor(string_t(buf));
    //setGenre(id3->genre);
    return true;
  }
  return false;
}
Beispiel #19
0
	id3v2_reader( DWORD handle ): m_header( 0 ), m_remap( remap_data,END_OF_ARRAY(remap_data) ), unsynced( false )
	{
		m_header = reinterpret_cast< const id3v2_header* >( BASS_ChannelGetTags( handle, BASS_TAG_ID3V2 ) );
		if( !m_header )
			throw no_tag(); // not supported
		m_header->check();

		tagsize=m_header->getsize();
		if (m_header->version_major==3 && m_header->flags&0x80) {
			id3v2_header* newhead=reinterpret_cast<id3v2_header*>(::operator new(sizeof(id3v2_header)+tagsize));
			*newhead=*m_header;
			tagsize=deunsync((char*)(m_header+1), tagsize, (char*)(newhead+1));
			m_header=newhead;
			unsynced=true;
		}
	}
/*
	Отображение название текущей играемой песни
*/
VOID Application::showNameSong(HSTREAM stream, HWND hWnd)
{
	TAG_ID3* id3 = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);		//получение данных о песне
	std::wstringstream infoAboutTheSong;									//Буфер строки (Название песни + Исполнитель + время)
	infoSong info;			
	TCHAR path[MAX_PATH];				//путь к файлу
	for (int i = 0;i < playlist.songs.size();i++)
	{
		if (stream == playlist.songs[i].hStream)
		{
			lstrcpy(path, playlist.songs[i].path);
			break;
		}
	}
	/*
		Если при загрузке какие то данные загрузились с результатом NULL, 
		то данные о песне вырезаются с пути
	*/
	if (id3 == NULL || strlen(id3->artist) == 0)
	{
		INT idx = lstrlen(path);
		INT length = idx;
		TCHAR name[MAX_PATH];
		INT k = 0;
		while (path[idx] != '\\')
		{
			idx--;
		}
		for (INT i = idx + 1; i < length;i++)
		{
			name[k] = path[i];
			k++;
		}
		name[k - 4] = '\0';			//Delete format songs
		infoAboutTheSong << name << "               ";
	}
	else
	{
		strcpy(info.title, id3->title);							//Name
		strcpy(info.artist, id3->artist);						//Author
		strcpy(info.album, id3->album);							//Album
		strcpy(info.year, id3->year);							//Year
		infoAboutTheSong << info.artist << " "
			<< info.title << "               ";
	}
	SetWindowText(hWnd, infoAboutTheSong.str().c_str());
}
Beispiel #21
0
// get stream title from metadata and send it as event
void CALLBACK MetaSync( HSYNC handle, DWORD channel, DWORD data, void *user )
{
    CBassAudio* pBassAudio = LockCallbackId( user );

    if ( pBassAudio )
    {
        pBassAudio->m_pVars->criticalSection.Lock ();
        DWORD pSound = pBassAudio->m_pVars->pSound;
        pBassAudio->m_pVars->criticalSection.Unlock ();

        const char* szMeta = BASS_ChannelGetTags( pSound, BASS_TAG_META );
        if ( szMeta )
        {
            SString strMeta = szMeta;
            if ( !strMeta.empty () )
            {
                pBassAudio->m_pVars->criticalSection.Lock ();
                pBassAudio->m_pVars->onClientSoundChangedMetaQueue.push_back ( strMeta );
                pBassAudio->m_pVars->criticalSection.Unlock ();
            }
        }
    }
    UnlockCallbackId();
}
Beispiel #22
0
BBArray * bmx_bass_channelgettags(DWORD handle, DWORD tags) {
	const char * text;
	TAG_ID3 *id3;
	
	switch (tags) {
		case BASS_TAG_ID3:
			id3 = (TAG_ID3*) BASS_ChannelGetTags(handle, BASS_TAG_ID3); // get the ID3 tags
			if (id3) {
				
				char buffer[4];
				
				BBArray * p = bbArrayNew1D("$", 7);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
							
				sprintf(buffer, "%.3s", id3->id);
				s[0] = bbStringFromCString(buffer);
				BBRETAIN( s[0] );
				
				s[1] = bbStringFromCString(id3->title);
				BBRETAIN( s[1] );
				
				s[2] = bbStringFromCString(id3->artist);
				BBRETAIN( s[2] );
				
				s[3] = bbStringFromCString(id3->album);
				BBRETAIN( s[3] );
	
				sprintf(buffer, "%.4s", id3->year);
				s[4] = bbStringFromCString(buffer);
				BBRETAIN( s[4] );
				
				s[5] = bbStringFromCString(id3->comment);
				BBRETAIN( s[5] );
							
				sprintf(buffer, "%d", id3->genre);
				s[6] = bbStringFromCString(buffer);
				BBRETAIN( s[6] );
				
				return p;
			} else {
				return &bbEmptyArray;
			}
		case BASS_TAG_META:
		case BASS_TAG_LYRICS3:
		case BASS_TAG_VENDOR:
		case BASS_TAG_MUSIC_NAME:
		case BASS_TAG_MUSIC_MESSAGE:
			text = BASS_ChannelGetTags(handle, tags);

			if (text) {
				BBArray * p = bbArrayNew1D("$", 1);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
				
				s[0] = bbStringFromCString( text );
				BBRETAIN( s[0] );

				return p;
			} else {
				return &bbEmptyArray;
			}
		
		default:
			text = BASS_ChannelGetTags(handle, tags);
			
			if (text) {
				int count = 0;
				const char * current = text;
				
				while (*current) {
					current += strlen(current) + 1;
					count++;
				}
				
				BBArray * p = bbArrayNew1D("$", count);
				BBString **s = (BBString**)BBARRAYDATA( p,p->dims );
				
				count = 0;
				current = text;
				while (*current) {
					s[count] = bbStringFromCString( current );
					BBRETAIN( s[count] );
		
					current += strlen(current) + 1;
					count++;
				}
				
				return p;
			
			} else {
				return &bbEmptyArray;
			}
	}
}
Beispiel #23
0
//
// Called from the main thread during DoPulse
//
void CBassAudio::CompleteStreamConnect ( HSTREAM pSound )
{
    if ( pSound )
    {
        m_pSound = pSound;

        BASS_ChannelGetAttribute ( pSound, BASS_ATTRIB_FREQ, &m_fDefaultFrequency );
        BASS_ChannelSetAttribute ( pSound, BASS_ATTRIB_FREQ, m_fPlaybackSpeed * m_fDefaultFrequency );
        if ( !m_b3D )
            BASS_ChannelSetAttribute( pSound, BASS_ATTRIB_VOL, m_fVolume );
        ApplyFxEffects ();
        // Set a Callback function for download finished or connection closed prematurely
        m_hSyncDownload = BASS_ChannelSetSync ( pSound, BASS_SYNC_DOWNLOAD, 0, &DownloadSync, m_uiCallbackId );
        SetFinishedCallbacks ();

        if ( BASS_FX_BPM_CallbackSet ( pSound, (BPMPROC*)&BPMCallback, 1, 0, 0, m_uiCallbackId ) == false )
        {
            g_pCore->GetConsole()->Print ( "BASS ERROR in BASS_FX_BPM_CallbackSet" );
        }
        if ( BASS_FX_BPM_BeatCallbackSet ( pSound, (BPMBEATPROC*)&BeatCallback, m_uiCallbackId ) == false )
        {
            g_pCore->GetConsole()->Print ( "BASS ERROR in BASS_FX_BPM_BeatCallbackSet" );
        }
        // get the broadcast name
        const char* szIcy;
        szIcy = BASS_ChannelGetTags ( pSound, BASS_TAG_ICY );
        if ( 
            ( szIcy = BASS_ChannelGetTags ( pSound, BASS_TAG_ICY ) )
         || ( szIcy = BASS_ChannelGetTags ( pSound, BASS_TAG_WMA ) )
         || ( szIcy = BASS_ChannelGetTags ( pSound, BASS_TAG_HTTP ) )
            )
        {
            if ( szIcy ) 
            {
                for ( ; *szIcy; szIcy += strlen ( szIcy ) + 1 )
                {
                    if ( !strnicmp ( szIcy, "icy-name:", 9 ) ) // ICY / HTTP
                    {
                        m_strStreamName = szIcy + 9;
                        break;
                    }
                    else if ( !strnicmp ( szIcy, "title=", 6 ) ) // WMA
                    {
                        m_strStreamName = szIcy + 6;
                        break;
                    }
                    //g_pCore->GetConsole()->Printf ( "BASS STREAM INFO  %s", szIcy );
                }
            }
        }
        // set sync for stream titles
        m_hSyncMeta = BASS_ChannelSetSync( pSound, BASS_SYNC_META, 0, &MetaSync, m_uiCallbackId ); // Shoutcast
        //g_pCore->GetConsole()->Printf ( "BASS ERROR %d in BASS_SYNC_META", BASS_ErrorGetCode() );
        //BASS_ChannelSetSync(pSound,BASS_SYNC_OGG_CHANGE,0,&MetaSync,this); // Icecast/OGG
        //g_pCore->GetConsole()->Printf ( "BASS ERROR %d in BASS_SYNC_OGG_CHANGE", BASS_ErrorGetCode() );
        //BASS_ChannelSetSync(pSound,BASS_SYNC_WMA_META,0,&MetaSync,this); // script/mid-stream tags
        //g_pCore->GetConsole()->Printf ( "BASS ERROR %d in BASS_SYNC_WMA_META", BASS_ErrorGetCode() );
        //BASS_ChannelSetSync(pSound,BASS_SYNC_WMA_CHANGE,0,&WMAChangeSync,this); // server-side playlist changes
        //g_pCore->GetConsole()->Printf ( "BASS ERROR %d in BASS_SYNC_WMA_CHANGE", BASS_ErrorGetCode() );
    }
    else
        g_pCore->GetConsole()->Printf ( "BASS ERROR %d in PlayStream  b3D = %s  path = %s", BASS_ErrorGetCode(), m_b3D ? "true" : "false", m_strPath.c_str() );

    OutputDebugLine ( "[Bass]        stream connect complete" );

    AddQueuedEvent ( SOUND_EVENT_STREAM_RESULT, m_strStreamName, GetLength (), pSound ? true : false );
}
Beispiel #24
0
tag_reader* reader_ogg( DWORD handle )
{
	return new preproc_reader( 
		BASS_ChannelGetTags( handle, BASS_TAG_OGG ),
		"OGG: bad tag format", remap, SIZE_OF_ARRAY(remap), '=', 0 );
}