merged: bug fixes from trunk. r25592,r25600,r25601
[xbmc:xbmc-antiquated.git] / xbmc / cores / paplayer / CodecFactory.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "system.h"
23 #include "XBAudioConfig.h"
24 #include "CodecFactory.h"
25 #include "MP3codec.h"
26 #include "APEcodec.h"
27 #include "CDDAcodec.h"
28 #include "OGGcodec.h"
29 #include "SHNcodec.h"
30 #include "FLACcodec.h"
31 #include "WAVcodec.h"
32 #include "WAVPackcodec.h"
33 #include "ModuleCodec.h"
34 #include "NSFCodec.h"
35 #include "AC3Codec.h"
36 #include "AC3CDDACodec.h"
37 #ifdef HAS_SPC_CODEC
38 #include "SPCCodec.h"
39 #endif
40 #include "GYMCodec.h"
41 #include "SIDCodec.h"
42 #include "AdplugCodec.h"
43 #include "VGMCodec.h"
44 #include "YMCodec.h"
45 #include "AIFFcodec.h"
46 #include "ADPCMCodec.h"
47 #include "TimidityCodec.h"
48 #include "ASAPCodec.h"
49 #include "URL.h"
50 #include "DVDPlayerCodec.h"
51 #ifdef HAS_DTS_CODEC
52 #include "DTSCodec.h"
53 #include "DTSCDDACodec.h"
54 #endif
55
56 ICodec* CodecFactory::CreateCodec(const CStdString& strFileType)
57 {
58   if (strFileType.Equals("mp3") || strFileType.Equals("mp2"))
59     return new MP3Codec();
60   else if (strFileType.Equals("ape") || strFileType.Equals("mac"))
61     return new APECodec();
62   else if (strFileType.Equals("cdda"))
63     return new CDDACodec();
64   else if (strFileType.Equals("mpc") || strFileType.Equals("mp+") || strFileType.Equals("mpp"))
65     return new DVDPlayerCodec();
66   else if (strFileType.Equals("shn"))
67 #ifdef _XBOX
68     return new SHNCodec();
69 #else
70     return new DVDPlayerCodec();
71 #endif
72   else if (strFileType.Equals("flac"))
73     return new FLACCodec();
74   else if (strFileType.Equals("wav"))
75     return new DVDPlayerCodec();
76 #ifdef HAS_DTS_CODEC
77   else if (strFileType.Equals("dts"))
78     return new DTSCodec();
79 #endif
80 #ifdef HAS_AC3_CODEC
81   else if (strFileType.Equals("ac3"))
82     return new AC3Codec();
83 #endif
84   else if (strFileType.Equals("m4a") || strFileType.Equals("aac"))
85     return new DVDPlayerCodec();
86   else if (strFileType.Equals("wv"))
87     return new WAVPackCodec();
88   else if (ModuleCodec::IsSupportedFormat(strFileType))
89     return new ModuleCodec();
90   else if (strFileType.Equals("nsf") || strFileType.Equals("nsfstream"))
91     return new NSFCodec();
92 #ifdef HAS_SPC_CODEC
93   else if (strFileType.Equals("spc"))
94     return new SPCCodec();
95 #endif
96   else if (strFileType.Equals("gym"))
97     return new GYMCodec();
98   else if (strFileType.Equals("sid") || strFileType.Equals("sidstream"))
99     return new SIDCodec();
100   else if (AdplugCodec::IsSupportedFormat(strFileType))
101     return new AdplugCodec();
102   else if (VGMCodec::IsSupportedFormat(strFileType))
103     return new VGMCodec();
104   else if (strFileType.Equals("ym"))
105     return new YMCodec();
106   else if (strFileType.Equals("wma"))
107     return new DVDPlayerCodec();
108   else if (strFileType.Equals("aiff") || strFileType.Equals("aif"))
109     return new AIFFCodec();
110   else if (strFileType.Equals("xwav"))
111     return new ADPCMCodec();
112   else if (TimidityCodec::IsSupportedFormat(strFileType))
113     return new TimidityCodec();
114   else if (ASAPCodec::IsSupportedFormat(strFileType) || strFileType.Equals("asapstream"))
115     return new ASAPCodec();
116   else if (strFileType.Equals("tta"))
117     return new DVDPlayerCodec();
118
119   return NULL;
120 }
121
122 ICodec* CodecFactory::CreateCodecDemux(const CStdString& strFile, const CStdString& strContent, unsigned int filecache)
123 {
124   CURL urlFile(strFile);
125   if( strContent.Equals("audio/mpeg") )
126     return new MP3Codec();
127   else if( strContent.Equals("audio/aac")
128     || strContent.Equals("audio/aacp") )
129   {
130     DVDPlayerCodec *pCodec = new DVDPlayerCodec;
131     if (urlFile.GetProtocol() == "shout" )
132       pCodec->SetContentType(strContent);
133     return pCodec;
134   }
135   else if( strContent.Equals("audio/x-ms-wma") )
136     return new DVDPlayerCodec();
137
138   if (urlFile.GetProtocol() == "lastfm" || urlFile.GetProtocol() == "shout")
139   {
140     return new MP3Codec(); // if we got this far with internet radio - content-type was wrong. gamble on mp3.
141   }
142
143   if (urlFile.GetFileType().Equals("wav"))
144   {
145     ICodec* codec;
146 #ifdef HAS_DTS_CODEC
147     //lets see what it contains...
148     //this kinda sucks 'cause if it's a plain wav file the file
149     //will be opened, sniffed and closed 2 times before it is opened *again* for wav
150     //would be better if the papcodecs could work with bitstreams instead of filenames.
151     codec = new DTSCodec();
152     if (codec->Init(strFile, filecache))
153     {
154       return codec;
155     }
156     delete codec;
157 #endif
158 #ifdef HAS_AC3_CODEC
159     codec = new AC3Codec();
160     if (codec->Init(strFile, filecache))
161     {
162       return codec;
163     }
164     delete codec;
165 #endif
166     codec = new ADPCMCodec();
167     if (codec->Init(strFile, filecache))
168     {
169       return codec;
170     }
171     codec = new WAVCodec();
172     if (codec->Init(strFile, filecache))
173     {
174       return codec;
175     }
176     delete codec;
177   }
178   if (urlFile.GetFileType().Equals("cdda"))
179   {
180 #ifdef HAS_DTS_CODEC
181     //lets see what it contains...
182     //this kinda sucks 'cause if it's plain cdda the file
183     //will be opened, sniffed and closed 2 times before it is opened *again* for cdda
184     //would be better if the papcodecs could work with bitstreams instead of filenames.
185     ICodec* codec = new DTSCDDACodec();
186     if (codec->Init(strFile, filecache))
187     {
188       return codec;
189     }
190     delete codec;
191 #endif
192 #ifdef HAS_AC3_CDDA_CODEC
193     codec = new AC3CDDACodec();
194     if (codec->Init(strFile, filecache))
195     {
196       return codec;
197     }
198     delete codec;
199 #endif
200   }
201   else if (urlFile.GetFileType().Equals("ogg") || urlFile.GetFileType().Equals("oggstream") || urlFile.GetFileType().Equals("oga"))
202   {
203     // oldnemesis: we want to use OGGCodec() for OGG music since unlike DVDCodec it provides better
204     //  timings for Karaoke. However OGGCodec() cannot handle ogg-flac and ogg videos, that's why this block.
205     ICodec* codec = new OGGCodec();
206     try
207     {
208       if (codec->Init(strFile, filecache))
209       {
210         delete codec; // class can't be inited twice - deinit doesn't properly deinit some members.
211         return new OGGCodec;
212       }
213     }
214     catch( ... )
215     {
216     }
217     delete codec;
218     return new DVDPlayerCodec();
219   }
220   //default
221   return CreateCodec(urlFile.GetFileType());
222 }