diff -r 000000000000 -r 29b1cd4cb562 bluetooth/gavdp/test/tavsrcUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/gavdp/test/tavsrcUtils.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,394 @@ +// Copyright (c) 2007-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 "tavsrcUtils.h" +#include "tavsrcConsole.h" + +#include +#include + +#include +#include + +void TTavsrcUtils::RegisterSinkSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle, + TBool aHeadphone, TBool aSpeaker, TBool aRecorder, + TBool aAmp) + { + CSdpAttrValue* attrVal = 0; + CSdpAttrValueDES* attrValDES = 0; + + // Set Attr 1 (service class list) to list with UUID = Audio Sink + aDB.CreateServiceRecordL(TUUID(KAudioSinkUUID), aRecHandle); + + // Protocol Descriptor List + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildDESL() + ->StartListL() + ->BuildUUIDL(TUUID(TUint16(KL2CAPUUID))) // L2CAP + ->BuildUintL(TSdpIntBuf(KAVDTP)) // PSM = AVDTP + ->EndListL() + ->BuildDESL() + ->StartListL() + ->BuildUUIDL(TUUID(TUint16(KAvdtpUUID))) // Avdtp UUID + ->BuildUintL(TSdpIntBuf(0x0100)) // Version + ->EndListL() + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES); + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + //BrowseGroupList + /* + This has been added in order to be interoperable with remote devices which only look for the + service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. + */ + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root) + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5 + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = NULL; + + // Language + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildUintL(TSdpIntBuf(KLanguageEnglish)) + ->BuildUintL(TSdpIntBuf(KSdpAttrIdCharacterEncodingUTF8)) + ->BuildUintL(TSdpIntBuf(KSdpAttrIdBasePrimaryLanguage)) + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES); + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + // BT Profile Description + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildDESL()->StartListL() + ->BuildUUIDL(KAdvancedAudioDistributionUUID) + ->BuildUintL(TSdpIntBuf(0x0100)) // version + ->EndListL() + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES); + + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + // provider name + attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // service name + attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution sink")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // service description + attrVal = CSdpAttrValueString::NewStringL(_L8("kick back and listen to some fine tunes with this neat service")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // supported features + TUint16 supportedFeatures = aHeadphone ? 1:0; + supportedFeatures|=aSpeaker ? 2:0; + supportedFeatures|=aRecorder ? 4:0; + supportedFeatures|=aAmp ? 8:0; + attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf(supportedFeatures)); + CleanupStack::PushL(attrVal); + + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdSupportedFeatures, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + } + +void TTavsrcUtils::RegisterSourceSDPRecordL(RSdpDatabase& aDB, TSdpServRecordHandle& aRecHandle, + TBool aPlayer, TBool aMic, TBool aTuner, TBool aMixer) + { + CSdpAttrValue* attrVal = 0; + CSdpAttrValueDES* attrValDES = 0; + + // Set Attr 1 (service class list) to list with UUID = Audio Sink + aDB.CreateServiceRecordL(TUUID(KAudioSourceUUID), aRecHandle); + + // Protocol Descriptor List + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildDESL() + ->StartListL() + ->BuildUUIDL(TUUID(TUint16(KL2CAPUUID))) // L2CAP + ->BuildUintL(TSdpIntBuf(KAVDTP)) // PSM = AVDTP + ->EndListL() + ->BuildDESL() + ->StartListL() + ->BuildUUIDL(TUUID(TUint16(KAvdtpUUID))) // Avdtp UUID + ->BuildUintL(TSdpIntBuf(0x0100)) // Version + ->EndListL() + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES); + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + //BrowseGroupList + /* + This has been added in order to be interoperable with remote devices which only look for the + service in the PublicBrowseGroup (the root of the browse hierarchy). This is not a mandatory feature. + */ + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID))) // Public browse group (the root) + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBrowseGroupList, *attrValDES); //attribute 5 + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = NULL; + + // Language + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildUintL(TSdpIntBuf(KLanguageEnglish)) + ->BuildUintL(TSdpIntBuf(KSdpAttrIdCharacterEncodingUTF8)) + ->BuildUintL(TSdpIntBuf(KSdpAttrIdBasePrimaryLanguage)) + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdLanguageBaseAttributeIDList, *attrValDES); + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + // BT Profile Description + attrValDES = CSdpAttrValueDES::NewDESL(0); + CleanupStack::PushL(attrValDES); + + attrValDES->StartListL() + ->BuildDESL()->StartListL() + ->BuildUUIDL(KAdvancedAudioDistributionUUID) + ->BuildUintL(TSdpIntBuf(0x0100)) // version + ->EndListL() + ->EndListL(); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES); + + CleanupStack::PopAndDestroy(attrValDES); + attrValDES = 0; + + // provider name + attrVal = CSdpAttrValueString::NewStringL(_L8("Symbian Software Ltd")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // service name + attrVal = CSdpAttrValueString::NewStringL(_L8("Advanced audio distribution source")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // service description + attrVal = CSdpAttrValueString::NewStringL(_L8("plug your wireless cans into me!")); + CleanupStack::PushL(attrVal); + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + + // supported features + TUint16 supportedFeatures = aPlayer ? 1:0; + supportedFeatures|=aMic ? 2:0; + supportedFeatures|=aTuner ? 4:0; + supportedFeatures|=aMixer ? 8:0; + attrVal = CSdpAttrValueUint::NewUintL(TSdpIntBuf(supportedFeatures)); + CleanupStack::PushL(attrVal); + + aDB.UpdateAttributeL(aRecHandle, KSdpAttrIdSupportedFeatures, *attrVal); + CleanupStack::PopAndDestroy(attrVal); + attrVal = 0; + } + +TInt TTavsrcUtils::GetIntFromUser(CConsoleBase& aConsole) + { + TBuf<4> inpb; + aConsole.Printf(_L(":")); + TInt x = aConsole.WhereX(); + TInt y = aConsole.WhereY(); + TRequestStatus stat; + + TChar ch(0); // set it to anything to prevent warning + while ((ch!='\n')&&(ch!='\r') && inpb.Length()==0) + { + aConsole.Read(stat); + User::WaitForRequest(stat); + ch = aConsole.KeyCode(); + + if ((ch=='\b') && (inpb.Length()>0)) + { + inpb.Delete(inpb.Length()-1,1); + } + + if ((inpb.Length()<4)&&((ch>='0')&&(ch<='9'))) + { + inpb.Append(ch); + } + + aConsole.SetPos(x,y); + aConsole.Printf(_L("%S"),&inpb); + } + + TLex lex(inpb); + TInt res; + return (lex.Val(res)==KErrNone) ? res : 0; + } + +TBool TTavsrcUtils::GetYNFromUser(CConsoleBase& aConsole, const TDesC& aDes) + { + TBuf<4> inpb; + aConsole.Printf(_L("%S (y/n):"),&aDes); + TRequestStatus stat; + + TChar ch(0); // set it to anything to prevent warning + while ((ch!='n')&&(ch!='y')) + { + aConsole.Read(stat); + User::WaitForRequest(stat); + ch = aConsole.KeyCode(); + } + aConsole.Printf(_L("%c"), static_cast(ch)); + return (ch=='y') ? ETrue : EFalse; + } + +void TTavsrcUtils::GetDeviceAddressL(TBTDevAddr& aAddr) + { + //Ask user which device address we should connect to... + RNotifier notify; + User::LeaveIfError(notify.Connect()); + TBTDeviceSelectionParamsPckg pckg; + TBTDeviceResponseParamsPckg resPckg; + TRequestStatus stat; + notify.StartNotifierAndGetResponse(stat, KDeviceSelectionNotifierUid, pckg, resPckg); + User::WaitForRequest(stat); + notify.CancelNotifier(KDeviceSelectionNotifierUid); + notify.Close(); + User::LeaveIfError(stat.Int()); + + aAddr = resPckg().BDAddr(); + } + +TInt TTavsrcUtils::GetCodecSettingsFromSBCFile(RFile& aFile, TInt aPos, TInt& aChannelMode, + TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen, + TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod) + { + TInt err = KErrNone; + + TBuf8<4> header; + aFile.Read(aPos, header); + TInt syncWord = header[0]; + __ASSERT_ALWAYS(syncWord==0x9C, User::Invariant()); + + TInt sampleFreq = (header[1]&0xC0)>>6; + TInt blockLen = (header[1]&0x30)>>4; + aChannelMode = (header[1]&0x0C)>>2; + aAllocMethod = (header[1]&0x02)>>1; + TInt subBands = (header[1]&0x01); + aBitPool = header[2]; + + aNumChannels = (aChannelMode==0) ? 1 : 2; + aNumSubbands = (subBands==1) ? 8 : 4; + + switch (sampleFreq) + { + case 0x00: + aFreq = 16000; + break; + case 0x01: + aFreq = 32000; + break; + case 0x02: + aFreq = 44100; + break; + case 0x03: + aFreq = 48000; + break; + } + + switch (blockLen) + { + case 0x00: + aBlkLen = 4; + break; + case 0x01: + aBlkLen = 8; + break; + case 0x02: + aBlkLen = 12; + break; + case 0x03: + aBlkLen = 16; + break; + } + + return err; + } + +TInt TTavsrcUtils::GetCodecSettingsFromSBCFile(const TDesC& aFileName, TInt& aChannelMode, + TInt& aNumChannels, TInt& aNumSubbands, TInt& aBlkLen, + TInt& aBitPool, TInt& aFreq, TInt& aAllocMethod) + { + TInt err = KErrNone; + + RFs fileserver; + RFile file; + + err = fileserver.Connect(); + if (!err) + { + err = file.Open(fileserver,aFileName,EFileRead | EFileShareReadersOnly); + } + if (err) + { + return err; + } + + err = GetCodecSettingsFromSBCFile(file, 0, aChannelMode, aNumChannels, aNumSubbands, + aBlkLen, aBitPool, aFreq, aAllocMethod); + file.Close(); + fileserver.Close(); + + return err; + } + +TInt TTavsrcUtils::CEIL(TReal aX) + { + TReal frac; + Math::Frac(frac,aX); + return (frac < 0.5) ? aX :aX+1; + }