diff -r 000000000000 -r 0e761a78d257 gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp Thu Dec 17 08:53:32 2009 +0200 @@ -0,0 +1,687 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "devsoundsrcwrapper.h" +#include +#include +#include "debugtracemacros.h" + +DevSoundWrapperSrc::DevSoundWrapperSrc() + { + init_complete = 0; + dev_sound = NULL; + buffersize = 0; + dev_count = 0; + caps.iRate = EMMFSampleRate8000Hz; + caps.iEncoding = EMMFSoundEncoding16BitPCM; + caps.iChannels = EMMFMono; + fourcc = KMMFFourCCCodePCM16; + iCallbackError = KErrNone; + iSpeechEncoderConfig = NULL; + iG711EncoderIntfc = NULL; + iG729EncoderIntfc = NULL; + iIlbcEncoderIntfc = NULL; + } + +/*********************************************************/ +void DevSoundWrapperSrc::InitializeComplete(TInt aError) + { + TRACE_PRN_FN_ENT; + TRequestStatus* stat = &(AL->iStatus); + + if (aError == KErrNone) + { + init_complete = 1; + } + else + { + init_complete = 0; + } + + User::RequestComplete(stat, aError); + TRACE_PRN_FN_EXT; + } +/************************************************************/ + +void DevSoundWrapperSrc::BufferToBeFilled(CMMFBuffer* /*aBuffer*/) + { + } + +/***********************************************************/ +void DevSoundWrapperSrc::PlayError(TInt /*aError*/) + { + } +/*******************************************************/ + +void DevSoundWrapperSrc::BufferToBeEmptied(CMMFBuffer* aBuffer) + { +// TRACE_PRN_FN_ENT; + + buffer = aBuffer; + bufferreadpos = 0; + CMMFDataBuffer* buf = STATIC_CAST (CMMFDataBuffer*, buffer); + buffersize = buf->Data().Length(); + TRACE_PRN_N1(_L("DevSoundWrapperSrc::BufferToBeEmptied->buffersize [%d]"), buffersize); + + TRequestStatus* stat = &(AL->iStatus); + if (aBuffer) + { + User::RequestComplete(stat, KErrNone); + iCallbackError = KErrNone; + } + else + { + User::RequestComplete(stat, KErrNotFound); + iCallbackError = KErrNotFound; + } +// TRACE_PRN_FN_EXT; + } +/********************************************************/ + +void DevSoundWrapperSrc::RecordError(TInt aError) + { + TRACE_PRN_FN_ENT; + TRACE_PRN_N1(_L("DevSoundWrapperSrc::RecordError %d"),aError); + iCallbackError = aError; + TRACE_PRN_FN_EXT; + } +/**********************************************************/ + +void DevSoundWrapperSrc::ConvertError(TInt /*aError*/) + { + + } +/***********************************************************/ +void DevSoundWrapperSrc::DeviceMessage(TUid /*aMessageType*/, const TDesC8& /*aMsg*/) + { + + } +/***********************************************************/ +void DevSoundWrapperSrc::SendEventToClient(const TMMFEvent& /*aEvent*/) + { + + } +/************************************************************/ +void DevSoundWrapperSrc::ToneFinished(TInt /*aError*/) + { + + } + +/*********************************************************** + *********C interface functions****************************** + ************************************************************/ + +/******************************************************/ +int get_databuffer(DevSoundWrapperSrc *handle, const TUint8** buffer) + { + int ret = 0; + CMMFDataBuffer* buf = STATIC_CAST (CMMFDataBuffer*, handle->buffer); + *buffer = buf->Data().Ptr(); + if (buffer) + { + ret = KErrNone; + } + else + { + ret = KErrNotFound; + } + return ret; + } + +/*********************************************************/ +int get_databuffer_size(DevSoundWrapperSrc *handle) + { + CMMFDataBuffer* buf = STATIC_CAST (CMMFDataBuffer*, handle->buffer); + return buf->Data().Length(); + } + +/*********************************************************/ +int open_devsound(DevSoundWrapperSrc **handle) + { + TRACE_PRN_FN_ENT; + int ret = 0; + *handle = new DevSoundWrapperSrc(); + if (handle) + { + ret = open_device(handle); + } + else + { + ret = KErrNoMemory; + } + TRACE_PRN_FN_EXT; + return ret; + } + +/*******************************************************/ +int initialize_devsound(GstDevsoundSrc* ds) + { + TRACE_PRN_FN_ENT; + int ret = 0; + DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; + + handle->AL->InitialiseActiveListener(); + + TRAP(ret, handle->dev_sound->InitializeL(*handle, handle->fourcc, EMMFStateRecording)); + + if (ret) + { + TRACE_PRN_FN_EXT; + return ret; + } + + handle->AL->StartActiveScheduler(); + + if (handle->init_complete == 1) + { + TMMFPrioritySettings temp; + temp.iPref = (TMdaPriorityPreference) ds->preference; + temp.iPriority = ds->priority; + handle->dev_sound->SetPrioritySettings(temp); + + SetConfigurations(handle); + ret = KErrNone; + } + else + { + ret = KErrNotFound; + } + + TRACE_PRN_IF_ERR(ret); + TRACE_PRN_FN_EXT; + return ret; + } +/*********************************************************/ + +int open_device(DevSoundWrapperSrc **handle) + { + int retcode = KErrNone; + TRACE_PRN_FN_ENT; + + (*handle)->dev_count++; + + (*handle)->as = CActiveScheduler::Current(); + + if (!((*handle)->as)) + { + (*handle)->as = new CActiveScheduler(); + if ((*handle)->as) + { + CActiveScheduler::Install((*handle)->as); + } + } + + (*handle)->AL = new CActiveListener; + ((*handle)->AL)->asw = new CActiveSchedulerWait(); + + TRAP( retcode,(*handle)->dev_sound = CMMFDevSound::NewL() ); + + if (!(*handle)->AL || !((*handle)->AL)->asw || !(*handle)->dev_sound + || !(*handle)->as) + { + retcode = KErrNoMemory; + } + + TRACE_PRN_FN_EXT; + + return retcode; + } + +/*********************************************************/ + +int close_devsound(GstDevsoundSrc *ds) + { + TRACE_PRN_FN_ENT; + (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->dev_sound->Stop(); + g_list_foreach(ds->supportedbitrates, (GFunc) g_free, NULL); + g_list_free(ds->supportedbitrates); + + g_list_foreach(ds->fmt, (GFunc) g_free, NULL); + g_list_free(ds->fmt); + + delete ds->handle; + TRACE_PRN_FN_EXT; + return 0; + } +/************************************************************/ + +int SetConfigurations(DevSoundWrapperSrc *handle) + { + TRACE_PRN_FN_ENT; + int ret = 0; + + TMMFCapabilities temp_caps; + temp_caps = (handle->dev_sound)->Capabilities(); + + handle->gain = (handle->dev_sound)->MaxGain(); + (handle->dev_sound)->SetGain(handle->gain); + handle->caps.iBufferSize = temp_caps.iBufferSize; + + TRAP(ret, (handle->dev_sound)->SetConfigL(handle->caps) ); + if (ret) + { + return ret; + } + + (handle->caps) = (handle->dev_sound)->Config(); + + switch (handle->fourcc) + { + case KMccFourCCIdG711: + { + if (!handle->iG711EncoderIntfc) + { + TRAP( ret, handle->iG711EncoderIntfc + = CG711EncoderIntfc::NewL(*handle->dev_sound) ); + } + break; + } + case KMccFourCCIdG729: + { + if (!handle->iG729EncoderIntfc) + { + TRAP( ret, handle->iG729EncoderIntfc + = CG729EncoderIntfc::NewL(*handle->dev_sound)); + } + + break; + } + case KMccFourCCIdILBC: + { + + if (!handle->iIlbcEncoderIntfc) + { + TRAP( ret, handle->iIlbcEncoderIntfc + = CIlbcEncoderIntfc::NewL(*handle->dev_sound)); + } + + break; + } + default: + { + break; + } + } + + if (!handle->iSpeechEncoderConfig && handle->fourcc + != KMMFFourCCCodePCM16) + { + + TRAP(ret, handle->iSpeechEncoderConfig + = CSpeechEncoderConfig::NewL(*handle->dev_sound)); + } + + TRACE_PRN_FN_EXT; + return ret; + } + +void DevSoundWrapperSrc::GetSpeechEncoderProperties(GstDevsoundSrc* ds) + { + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + get_speech_encoder_supported_bit_rates(ds); + get_speech_encoder_bit_rate(dsPtr, &ds->speechbitrate); + get_speech_encoder_vad_mode(dsPtr, &ds->speechvadmode); + + } + +/*********************************************************/ +int get_speech_encoder_bit_rate(DevSoundWrapperSrc *handle, guint* aBitrate) + { + int err = 0; + if (handle->iSpeechEncoderConfig) + { + err = (handle->iSpeechEncoderConfig)->GetBitrate(*aBitrate); + } + return err; + } +/*********************************************************/ +int get_speech_encoder_supported_bit_rates(GstDevsoundSrc *ds) + { + int err = 0; + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + TRAP(err, err = dsPtr->GetSupportedBitratesL(ds)); + + return err; + } + +int DevSoundWrapperSrc::GetSupportedBitratesL(GstDevsoundSrc* ds) + { + int err = 0; + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + if (dsPtr->iSpeechEncoderConfig) + { + RArray bitrates; + + CleanupClosePushL(bitrates); + err = (dsPtr->iSpeechEncoderConfig)->GetSupportedBitrates(bitrates); + for (TInt i = 0; i < bitrates.Count(); i++) + { + guint *ip = g_new (guint, 1); + *ip = bitrates[i]; + ds->supportedbitrates = g_list_append(ds->supportedbitrates, ip); + } + CleanupStack::PopAndDestroy(&bitrates); + } + return err; + } + +/*********************************************************/ +int get_speech_encoder_vad_mode(DevSoundWrapperSrc *handle, + gboolean* aVadMode) + { + int err = 0; + if (handle->iSpeechEncoderConfig) + { + err = (handle->iSpeechEncoderConfig)->GetVadMode(*aVadMode); + } + return err; + } + +/*********************************************************/ +int set_speech_encoder_bit_rate(DevSoundWrapperSrc *handle, guint aBitrate) + { + int err = 0; + if (handle->iSpeechEncoderConfig) + { + err = (handle->iSpeechEncoderConfig)->SetBitrate(aBitrate); + } + return err; + } + +/*********************************************************/ +int set_speech_encoder_vad_mode(DevSoundWrapperSrc *handle, gboolean aVadMode) + { + int err = 0; + if (handle->iSpeechEncoderConfig) + { + err = (handle->iSpeechEncoderConfig)->SetVadMode(aVadMode); + } + return err; + } + +/*********************************************************/ +int get_g711_encoder_vad_mode(DevSoundWrapperSrc *handle, gboolean* aVadMode) + { + int err = 0; + if (handle->iG711EncoderIntfc) + { + err = (handle->iG711EncoderIntfc)->GetVadMode(*aVadMode); + } + return err; + } + +/*********************************************************/ +int set_g711_encoder_mode(DevSoundWrapperSrc *handle, + enum TG711EncodeMode aEncodeMode) + { + int err = 0; + if (handle->iG711EncoderIntfc) + { + err = (handle->iG711EncoderIntfc)->SetEncoderMode( + (CG711EncoderIntfc::TEncodeMode) aEncodeMode); + } + return err; + } + +/*********************************************************/ +int set_g711_vad_mode(DevSoundWrapperSrc *handle, gboolean aVadMode) + { + int err = 0; + if (handle->iG711EncoderIntfc) + { + err = (handle->iG711EncoderIntfc)->SetVadMode(aVadMode); + } + return err; + } + +/**************************************************************/ +int set_g729_vad_mode(DevSoundWrapperSrc *handle, TBool aVadMode) + { + int err = 0; + if (handle->iG729EncoderIntfc) + { + err = (handle->iG729EncoderIntfc)->SetVadMode(aVadMode); + } + return err; + } +/**************************************************************/ +int get_g729_vad_mode(DevSoundWrapperSrc *handle, TBool* aVadMode) + { + int err = 0; + if (handle->iG729EncoderIntfc) + { + err = (handle->iG729EncoderIntfc)->GetVadMode(*aVadMode); + } + return err; + } +/**************************************************************/ +int set_ilbc_encoder_mode(DevSoundWrapperSrc *handle, + enum TIlbcEncodeMode aEncodeMode) + { + int err = 0; + if (handle->iIlbcEncoderIntfc) + { + err = (handle->iIlbcEncoderIntfc)->SetEncoderMode( + (CIlbcEncoderIntfc::TEncodeMode) aEncodeMode); + } + return err; + } +/**************************************************************/ +int set_ilbc_vad_mode(DevSoundWrapperSrc *handle, gboolean aVadMode) + { + int err = 0; + if (handle->iIlbcEncoderIntfc) + { + err = (handle->iIlbcEncoderIntfc)->SetVadMode(aVadMode); + } + return err; + } +/**************************************************************/ +int get_ilbc_vad_mode(DevSoundWrapperSrc *handle, gboolean* aVadMode) + { + int err = 0; + if (handle->iIlbcEncoderIntfc) + { + err = (handle->iIlbcEncoderIntfc)->GetVadMode(*aVadMode); + } + return err; + } + +/**************************************************************/ +int reset_devsound(DevSoundWrapperSrc */*handle*/) + { + return 0; + } +/*****************************************************************/ +int get_rate(DevSoundWrapperSrc *handle) + { + return handle->caps.iRate; + + } +/*****************************************************************/ +int get_channels(DevSoundWrapperSrc *handle) + { + return handle->caps.iChannels; + + } +/********************************************************************/ +int get_encoding(DevSoundWrapperSrc *handle) + { + return handle->caps.iEncoding; + } +/*******************************************************************/ +int get_size(DevSoundWrapperSrc *handle) + { + return handle->caps.iBufferSize; + } +/******************************************************************/ + +void set_rate(DevSoundWrapperSrc *handle, int rate) + { + handle->caps.iRate = rate; + } +/******************************************************************/ +void set_channels(DevSoundWrapperSrc *handle, int channels) + { + handle->caps.iChannels = channels; + } +/****************************************************************/ +void set_encoding(DevSoundWrapperSrc *handle, int encoding) + { + handle->caps.iEncoding = encoding; + } +/*****************************************************************/ +void set_size(DevSoundWrapperSrc *handle, int size) + { + handle->caps.iBufferSize = size; + } +/*****************************************************************/ +void set_fourcc(DevSoundWrapperSrc *handle, int fourcc) + { + handle->fourcc = fourcc; + } + +/*******************************************************************/ + +int recordinit(DevSoundWrapperSrc *handle) + { + TRACE_PRN_FN_ENT; + int ret = 0; + ((handle)->AL)->InitialiseActiveListener(); + handle->iCallbackError = KErrNone; + + TRAP(ret, (handle->dev_sound)->RecordInitL() ); + + if (ret) + { + TRACE_PRN_FN_EXT; + return ret; + } + ((handle)->AL)->StartActiveScheduler(); + + if ((handle->iCallbackError) != KErrNone) + { + TRACE_PRN_FN_EXT; + return (handle->iCallbackError); + } + TRACE_PRN_FN_EXT; + return KErrNone; + + } + +/*******************************************************************/ +int record_data(DevSoundWrapperSrc *handle) + { + TRACE_PRN_FN_ENT; + + (handle->AL)->InitialiseActiveListener(); + (handle->dev_sound)->RecordData(); + ((handle)->AL)->StartActiveScheduler(); + + TRACE_PRN_FN_EXT; + return KErrNone; + } + +/*********************************************************************/ + +int pre_init_setconf(GstDevsoundSrc *ds) + { + TRACE_PRN_FN_ENT; + int ret = 0; + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + + // NOTE: it is too late for setting prio/pref here + if (ds->pending.preferenceupdate == 1 || ds->pending.priorityupdate == 1) + { + ds->pending.preferenceupdate = FALSE; + ds->pending.priorityupdate = FALSE; + } + if (ds->pending.gainupdate == 1) + { + (dsPtr->dev_sound)->SetGain(ds->gain); + ds->pending.gainupdate = FALSE; + } + + if (ds->pending.leftbalanceupdate == 1 || ds->pending.rightbalanceupdate + == 1) + { + + TRAP( ret, (dsPtr->dev_sound)->SetRecordBalanceL(ds->leftbalance, + ds->rightbalance) ); + ds->pending.leftbalanceupdate = FALSE; + ds->pending.rightbalanceupdate = FALSE; + } + TRACE_PRN_FN_EXT; + return ret; + } +/*********************************************************/ +void getsupporteddatatypes(GstDevsoundSrc *ds) + { + TRACE_PRN_FN_ENT; + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + TRAP_IGNORE(dsPtr->GetDataTypesL(ds)); + + TRACE_PRN_FN_EXT; + } +/*********************************************************/ +void DevSoundWrapperSrc::GetDataTypesL(GstDevsoundSrc *ds) + { + TRACE_PRN_FN_ENT; + + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + RArray inputdatatypes; + TMMFPrioritySettings prioritysettings; + + CleanupClosePushL(inputdatatypes); + + (dsPtr->dev_sound)->GetSupportedInputDataTypesL(inputdatatypes, + prioritysettings); + + for (TInt i = 0; i < inputdatatypes.Count(); i++) + { + TRACE_PRN_N2(_L("GstDevsoundSrc supported Codec[%d]==[0x%x]"), i+1, inputdatatypes[i].FourCC()); + guint *ip = g_new (guint, 1); + *ip = inputdatatypes[i].FourCC(); + ds->fmt = g_list_append(ds->fmt, ip); + } + + CleanupStack::PopAndDestroy(&inputdatatypes); + TRACE_PRN_FN_EXT; + } +/*********************************************************/ +void populateproperties(GstDevsoundSrc *ds) + { + TRACE_PRN_FN_ENT; + DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + ds->samplesrecorded = (dsPtr->dev_sound)->SamplesRecorded(); + TRACE_PRN_FN_EXT; + } + +void initproperties(GstDevsoundSrc* ds) + { + TRACE_PRN_FN_ENT; + DevSoundWrapperSrc* dsPtr= STATIC_CAST(DevSoundWrapperSrc*, ds->handle); + ds->gain = (dsPtr->dev_sound)->Gain(); + ds->maxgain = (dsPtr->dev_sound)->MaxGain(); + dsPtr->GetSpeechEncoderProperties(ds); + get_g711_encoder_vad_mode(dsPtr, &ds->g711vadmode); + get_g729_vad_mode(dsPtr, &ds->g729vadmode); + get_ilbc_vad_mode(dsPtr, &ds->ilbcvadmode); + TRACE_PRN_FN_EXT; + } +