added: codecs can now use the duration given in the tag of the passed fileitem. usefu...
[xbmc:xbmc.git] / xbmc / cores / paplayer / ICodec.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2008 Team XBMC
5  *      http://www.xbmc.org
6  *
7  *  This Program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2, or (at your option)
10  *  any later version.
11  *
12  *  This Program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with XBMC; see the file COPYING.  If not, write to
19  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  *  http://www.gnu.org/copyleft/gpl.html
21  *
22  */
23
24 #include "ReplayGain.h"
25 #include "StdString.h"
26 #include "FileSystem/File.h"
27
28 #define READ_EOF      -1
29 #define READ_SUCCESS   0
30 #define READ_ERROR     1
31
32 class ICodec
33 {
34 public:
35   ICodec()
36   {
37     m_TotalTime = 0;
38     m_SampleRate = 0;
39     m_BitsPerSample = 0;
40     m_Channels = 0;
41     m_Bitrate = 0;
42     m_CodecName = "";
43   };
44   virtual ~ICodec() {};
45
46   // Virtual functions that all codecs should implement.  Note that these may need
47   // enhancing and or refactoring at a later date.  It works currently well for MP3 and
48   // APE codecs.
49
50   // Init(filename)
51   // This routine should handle any initialization necessary.  At a minimum it needs to:
52   // 1.  Load any dlls and make sure any buffers etc. are allocated.
53   // 2.  If it's using a filereader, initialize it with the appropriate cache size.
54   // 3.  Load the file (or at least attempt to load it)
55   // 4.  Fill in the m_TotalTime, m_SampleRate, m_BitsPerSample and m_Channels parameters.
56   virtual bool Init(const CStdString &strFile, unsigned int filecache)=0;
57
58   // DeInit()
59   // Should just cleanup anything as necessary.  No need to free buffers here if they
60   // are allocated and destroyed in the destructor.
61   virtual void DeInit()=0;
62
63   virtual bool CanSeek() {return true;}
64
65   // Seek()
66   // Should seek to the appropriate time (in ms) in the file, and return the
67   // time to which we managed to seek (in the case where seeking is problematic)
68   // This is used in FFwd/Rewd so can be called very often.
69   virtual __int64 Seek(__int64 iSeekTime)=0;
70
71   // ReadPCM()
72   // Decodes audio into pBuffer up to size bytes.  The actual amount of returned data
73   // is given in actualsize.  Returns READ_SUCCESS on success.  Returns READ_EOF when
74   // the data has been exhausted, and READ_ERROR on error.
75   virtual int ReadPCM(BYTE *pBuffer, int size, int *actualsize)=0;
76
77   // ReadSamples()
78   // Decodes audio into floats (normalized to 1) into pBuffer up to numsamples samples.
79   // The actual amount of returned samples is given in actualsamples.  Samples are
80   // total samples (ie distributed over channels).
81   // Returns READ_SUCCESS on success.  Returns READ_EOF when the data has been exhausted,
82   // and READ_ERROR on error.
83   virtual int ReadSamples(float *pBuffer, int numsamples, int *actualsamples) { return READ_ERROR; };
84
85   // CanInit()
86   // Should return true if the codec can be initialized
87   // eg. check if a dll needed for the codec exists
88   virtual bool CanInit()=0;
89
90   // SkipNext()
91   // Skip to next track/item inside the current media (if supported).
92   virtual bool SkipNext(){return false;}
93
94   // set the total time - useful when info comes from a preset tag
95   virtual void SetTotalTime(__int64 totaltime) {}
96
97   virtual bool IsCaching()    const    {return false;}
98   virtual int GetCacheLevel() const    {return -1;}
99
100   // true if we can retrieve normalized float data immediately
101   virtual bool HasFloatData() const { return false; }
102
103   __int64 m_TotalTime;  // time in ms
104   int m_SampleRate;
105   int m_BitsPerSample;
106   int m_Channels;
107   int m_Bitrate;
108   CStdString m_CodecName;
109   CReplayGain m_replayGain;
110   XFILE::CFile m_file;
111 };
112