mmfenh/advancedaudiocontroller/audiotonecontrollerplugin/ringtonerecognizer/src/recrt.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/advancedaudiocontroller/audiotonecontrollerplugin/ringtonerecognizer/src/recrt.cpp Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,128 @@
+/*
+* Copyright (c) 2002-2006 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: Implementation of RingToneRecognizer
+*
+*/
+
+
+// INCLUDE FILES
+#include <apmrec.h>
+#include <apmstd.h>
+#include <implementationproxy.h>
+
+#include "recrt.h"
+
+// CONSTANTS
+const TUid KUidRingingToneRecognizer={0x100059EA};
+const TInt KMinBufferLength=3; // minimum amount of file needed to determine a ringing tone IF it's not called .rng
+const TInt KMaxBufferLength=4; // maximum amount of buffer space we will ever use
+const TInt KRecRtCommandByte=2; // 00000010 = <command length>
+const TInt KRecRtUnicodeCommandByte=3; // 00000011 = <command length> if unicode
+const TInt KRecRtProgrammingByte=74; // 01001010 = <ringing-tone programming> + 0
+const TInt KRecRtSoundByte=58; // 00111010 = <sound> + 0
+const TInt KRecRtUnicodeByte=68; // 01000100 = <unicode> + 0
+const TInt KRecRtFileExtensionsMightBeValid=4; // If the file name length > 4, the file extension might be valid
+
+_LIT(KRingToneExtension1, ".rng");
+_LIT(KRingToneExtension2, ".nrt");
+_LIT(KRingToneExtension3, ".ota");
+_LIT8(KDataTypeRingingTone,"application/vnd.nokia.ringing-tone");
+
+
+
+CApaRingingToneRecognizer::CApaRingingToneRecognizer()
+ : CApaDataRecognizerType(KUidRingingToneRecognizer, CApaDataRecognizerType::ENormal)
+ {
+ iCountDataTypes=1;
+ }
+
+CApaRingingToneRecognizer::~CApaRingingToneRecognizer()
+ {
+ // Do nothing
+ }
+
+TUint CApaRingingToneRecognizer::PreferredBufSize()
+ {
+ return KMaxBufferLength;
+ }
+
+TDataType CApaRingingToneRecognizer::SupportedDataTypeL(TInt /*aIndex*/) const
+ {
+// __ASSERT_DEBUG(aIndex==0,User::Invariant());
+ return TDataType(KDataTypeRingingTone);
+ }
+
+void CApaRingingToneRecognizer::DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer)
+{
+ TBool nameRecognized=EFalse;
+ if (aName.Length()>KRecRtFileExtensionsMightBeValid)
+ {
+ if ((aName.Right(KRecRtFileExtensionsMightBeValid).CompareF(KRingToneExtension1)==0) ||
+ (aName.Right(KRecRtFileExtensionsMightBeValid).CompareF(KRingToneExtension2)==0) ||
+ (aName.Right(KRecRtFileExtensionsMightBeValid).CompareF(KRingToneExtension3)==0))
+ nameRecognized=ETrue;
+ }
+
+ TInt length=aBuffer.Length();
+ if (length<KMinBufferLength)
+ return; // too short to be a ring tone
+ TBool validChars=EFalse;
+
+ if(aBuffer[0] == KRecRtCommandByte ) //if it's a ring tone, it's not in unicode format
+ {
+ if (aBuffer[1] == KRecRtProgrammingByte && aBuffer[2] == KRecRtSoundByte)
+ validChars = ETrue;
+ }
+ else if (aBuffer[0] == KRecRtUnicodeCommandByte) // if it's a ring tone, it is in unicode format
+ {
+ if (aBuffer[1] == KRecRtProgrammingByte && aBuffer[2] == KRecRtUnicodeByte && aBuffer[3] == KRecRtSoundByte)
+ validChars = ETrue;
+ }
+ else if(aBuffer[0] == 0x00 && aBuffer[1] == 0x11 && aBuffer[2] == 0x06)
+ {
+ validChars = ETrue;
+ }
+
+ if (!validChars)
+ return; // not a ringing tone
+ else
+ {
+ if (!nameRecognized)
+ iConfidence=EProbable; // is probably a ringing tone
+ else
+ iConfidence=ECertain; // is certainly a ringing tone
+ iDataType=TDataType(KDataTypeRingingTone);
+ }
+}
+
+
+
+CApaDataRecognizerType* CApaRingingToneRecognizer::CreateRecognizerL()
+ {
+ return new (ELeave) CApaRingingToneRecognizer();
+ }
+
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY(KRingingToneRecognizerImplementationUid, CApaRingingToneRecognizer::CreateRecognizerL)
+ };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+
+// End of file