/* * MP3/MPlayer plugin to VDR (C++) * * (C) 2001-2005 Stefan Huelswitt * * This code is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html */ #include #include #include #include #include "common.h" #include "decoder-mp3-stream.h" #include "stream.h" // --- cNetScanID3 ------------------------------------------------------------- class cNetScanID3 : public cScanID3 { private: cNetStream *nstr; // void IcyInfo(void); public: cNetScanID3(cNetStream *Str, bool *Urgent); virtual bool DoScan(bool KeepOpen=false); virtual void InfoHook(struct mad_header *header); }; cNetScanID3::cNetScanID3(cNetStream *Str, bool *Urgent) :cScanID3(Str,Urgent) { nstr=Str; } bool cNetScanID3::DoScan(bool KeepOpen) { Clear(); IcyInfo(); if(!Title) FakeTitle(nstr->Filename); Total=0; ChMode=3; DecoderID=DEC_MP3S; InfoDone(); return true; } void cNetScanID3::InfoHook(struct mad_header *header) { if(nstr->IcyChanged()) IcyInfo(); SampleFreq=header->samplerate; Channels=MAD_NCHANNELS(header); ChMode=header->mode; int br=header->bitrate; if(Bitrate<0) Bitrate=br; else if(Bitrate!=br) { if(MaxBitrate<0) { if(BitrateMaxBitrate) MaxBitrate=br; if(brIcyTitle(); const char *a; if(t) { a=nstr->IcyName(); if(!a) a=nstr->IcyUrl(); } else { t=nstr->IcyName(); a=nstr->IcyUrl(); } if(t && (!Title || strcmp(t,Title))) { free(Title); Title=strdup(t); } if(a && (!Album || strcmp(a,Album))) { free(Album); Album=strdup(a); } } // --- cMP3StreamDecoder ------------------------------------------------------- cMP3StreamDecoder::cMP3StreamDecoder(const char *Filename) :cMP3Decoder(Filename,false) { nstr=new cNetStream(filename); str=nstr; nscan=new cNetScanID3(nstr,&urgentLock); scan=nscan; isStream=true; } bool cMP3StreamDecoder::Valid(void) { bool res=false; if(TryLock()) { if(nstr->Valid()) res=true; Unlock(); } return res; }