00001
00002
00003
00004
00005
00006
00007 #include <e32base.h>
00008 #include <ecom/implementationproxy.h>
00009 #include <mmf/server/mmfswcodecwrapper.h>
00010 #include "VorbisEncoder.h"
00011 #include "VorbisEncoderUIDs.hrh"
00012 #include "VorbisEncoderPlugIn.h"
00013
00014
00015
00016 const TInt KSourceBufferSize = 0x4000;
00017 const TInt KSinkBufferSize = 0x4000;
00018
00019 CVorbisEncoderPlugInWrapper* CVorbisEncoderPlugInWrapper::NewL()
00020 {
00021 DEBUG("CVorbisHwDeviceWrapper2::NewL");
00022 CVorbisEncoderPlugInWrapper* self = new(ELeave)CVorbisEncoderPlugInWrapper;
00023 CleanupStack::PushL(self);
00024 self->ConstructL();
00025 CleanupStack::Pop(self);
00026 return self;
00027 }
00028
00029 void CVorbisEncoderPlugInWrapper::ConstructL()
00030 {
00031 iDevice = CVorbisEncoderPlugIn::NewL();
00032 }
00033
00034 CVorbisEncoderPlugInWrapper::~CVorbisEncoderPlugInWrapper()
00035 {
00036 DEBUG("CVorbisEncoderPlugInWrapper::~CVorbisEncoderPlugInWrapper");
00037
00038 if (!iCodecReturned)
00039 {
00040 delete iDevice;
00041 }
00042 }
00043
00044 CVorbisEncoderPlugInWrapper::CVorbisEncoderPlugInWrapper()
00045 {
00046 }
00047
00048 TInt CVorbisEncoderPlugInWrapper::SetConfig(TTaskConfig& aConfig)
00049 {
00050 TInt err = CMMFSwCodecWrapper::SetConfig(aConfig);
00051 if (err != KErrNone)
00052 {
00053 return err;
00054 }
00055 err = static_cast<CVorbisEncoderPlugIn* >(iCodec)->Configure(iSampleRate, iChannels);
00056 return err;
00057 }
00058
00065 CMMFSwCodec& CVorbisEncoderPlugInWrapper::Codec()
00066 {
00067 DEBUG("CVorbisHwDeviceWrapper2::Codec");
00068 iCodecReturned=ETrue;
00069 return *iDevice;
00070 }
00071
00072
00073 TInt CVorbisEncoderPlugInWrapper::Start(TDeviceFunc aFuncCmd, TDeviceFlow aFlowCmd)
00074 {
00075 TInt err = CMMFSwCodecWrapper::Start(aFuncCmd, aFlowCmd);
00076 if(err == KErrNone)
00077 {
00078 SetVbrFlag();
00079 }
00080 return err;
00081 }
00082
00095 TAny* CVorbisEncoderPlugInWrapper::CustomInterface(TUid aInterfaceId)
00096 {
00097
00098
00099 if (aInterfaceId == KUidCustomInterfaceDevSoundBitRate)
00100 {
00101 return static_cast<MMMFDevSoundCustomInterfaceBitRate*> (this);
00102 }
00103 else
00104 {
00105
00106 return CMMFSwCodecWrapper::CustomInterface(aInterfaceId);
00107 }
00108 }
00116 void CVorbisEncoderPlugInWrapper::GetSupportedBitRatesL(RArray<TInt>& aSupportedBitRates)
00117 {
00118 aSupportedBitRates.Reset();
00119 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQualityMinus1));
00120 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality0));
00121 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality1));
00122 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality2));
00123 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality3));
00124 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality4));
00125 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality5));
00126 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality6));
00127 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality7));
00128 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality8));
00129 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality9));
00130 User::LeaveIfError(aSupportedBitRates.Append(KVorbisQuality10));
00131 }
00132
00138 TInt CVorbisEncoderPlugInWrapper::BitRateL()
00139 {
00140 return static_cast<CVorbisEncoderPlugIn* >(iCodec)->BitRateL();
00141 }
00142
00149 void CVorbisEncoderPlugInWrapper::SetBitRateL(TInt aBitRate)
00150 {
00151 static_cast<CVorbisEncoderPlugIn* >(iCodec)->SetBitRateL(aBitRate);
00152 }
00153
00154
00155 CVorbisEncoderPlugIn* CVorbisEncoderPlugIn::NewL()
00156 {
00157 DEBUG("CVorbisEncoderPlugIn::NewL");
00158 CVorbisEncoderPlugIn* self = new(ELeave)CVorbisEncoderPlugIn;
00159 CleanupStack::PushL(self);
00160 self->ConstructL();
00161 CleanupStack::Pop(self);
00162 return self;
00163 }
00164
00165 CVorbisEncoderPlugIn::CVorbisEncoderPlugIn()
00166 {
00167 }
00168
00169 CVorbisEncoderPlugIn::~CVorbisEncoderPlugIn()
00170 {
00171 DEBUG("CVorbisEncoderPlugIn::~CVorbisEncoderPlugIn");
00172 delete iProc;
00173 }
00174
00175 void CVorbisEncoderPlugIn::ConstructL()
00176 {
00177 iProc = CVorbisProcessor::NewL();
00178 }
00195 CMMFSwCodec::TCodecProcessResult CVorbisEncoderPlugIn::ProcessL(const CMMFBuffer& aSource, CMMFBuffer& aDst)
00196 {
00197
00198 CMMFSwCodec::TCodecProcessResult res;
00199 CVorbisProcessor::TProcessResult status;
00200 iProc->ProcessL(aSource, aDst, status, res.iSrcBytesProcessed, res.iDstBytesAdded);
00201 switch (status)
00202 {
00203 case CVorbisProcessor::EComplete:
00204 res.iCodecProcessStatus = TCodecProcessResult::EProcessComplete;
00205 break;
00206 case CVorbisProcessor::EIncomplete:
00207 res.iCodecProcessStatus = TCodecProcessResult::EProcessIncomplete;
00208 break;
00209 case CVorbisProcessor::EDestNotFilled:
00210 res.iCodecProcessStatus = TCodecProcessResult::EDstNotFilled;
00211 break;
00212 }
00213 return res;
00214 }
00215
00216 TUint CVorbisEncoderPlugIn::SourceBufferSize()
00217 {
00218 return KSourceBufferSize;
00219 }
00220
00221 TUint CVorbisEncoderPlugIn::SinkBufferSize()
00222 {
00223 return KSinkBufferSize;
00224 }
00225
00226 TInt CVorbisEncoderPlugIn::BitRateL()
00227 {
00228 return iProc->BitRateL();
00229 }
00230
00231 void CVorbisEncoderPlugIn::SetBitRateL(TInt aBitRate)
00232 {
00233 iProc->SetBitRateL(aBitRate);
00234 }
00235
00236 TInt CVorbisEncoderPlugIn::Configure(TInt aSampleRate, TInt aChannels)
00237 {
00238 TRAPD(err, iProc->ConfigureL(aSampleRate, aChannels));
00239 return err;
00240 }
00241
00242
00243
00244
00245 const TImplementationProxy ImplementationTable[] =
00246 {
00247 IMPLEMENTATION_PROXY_ENTRY(KVorbisHwEncodeUid, CVorbisEncoderPlugInWrapper::NewL),
00248 };
00249
00250 EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
00251 {
00252 aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
00253
00254 return ImplementationTable;
00255 }