// --------------------------------------------------------------------------- // This method is for closing the sender down. // --------------------------------------------------------------------------- // void CBTAudioStreamSender::Stop() { BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamSender::Stop() ->"))); // Make sure that the packet is not out at the moment. Cancel(); if(iCurrentSendPacket->IsOpen() != EFalse) { iCurrentSendPacket->Close(); } if(iSpareSendPacket->IsOpen() != EFalse) { iSpareSendPacket->Close(); } // Remove the ACL link optimisation if optimiser service is available. if(iLinkOptimiserAvailable) { TBTSockAddr addr; iRtpSession.RtpSocket()->RemoteName(addr); // Not checking the return code, because it doesn't matter if it fails. iA2DPOptimiser.RemoveAclOptimisation(addr.BTAddr()); } iStreamerState = EStopped; BT_AUDIO_STREAMER_TRACE_OPT( KPRINTSTATE, FLOG(_L("[BTAudioStreamer]\t State changed to: EStopped"))); BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamSender::Stop() <-"))); }
QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const { TBTSockAddr address; if(!iSocket) { // need to return something anyway return QBluetoothAddress(); } iSocket->RemoteName(address); return qTBTDevAddrToQBluetoothAddress(address.BTAddr()); }
SYSCALL(int, maConnGetAddr(MAHandle conn, MAConnAddr* addr)) { LOGST("maConnGetAddr(%i, 0x%08X)", conn, addr); if(conn == HANDLE_LOCAL) { if(addr->family == CONN_FAMILY_BT) { TBTDevAddr btaddr; //TPckgBuf<TBTDevAddr> pckg(btaddr); //old style, might work on Symbian 7.0 and earlier //update: doesn't work on 6630. #if 0//!defined(__SERIES60_3X__) RSocket socket; socket.Open(gSocketServ, KBTAddrFamily, KSockSeqPacket, KL2CAP); TRequestStatus status; socket.Ioctl(KHCILocalAddressIoctl, status, &pckg, KSolBtHCI); User::WaitForRequest(status); LOG("KHCILocalAddressIoctl result: %i\n", status.Int()); socket.Close(); if(status != KErrNone) { return CONNERR_GENERIC; } #else #if 0 //doesn't work; bug in Symbian. int result = RProperty::Get(KUidSystemCategory, KPropertyKeyBluetoothGetLocalDeviceAddress, pckg); LOG("KPropertyKeyBluetoothGetLocalDeviceAddress result: %i\n", result); if(result != KErrNone) { return CONNERR_GENERIC; } #else //open a server socket and read its address. RSocket socket; socket.Open(gSocketServ, KBTAddrFamily, KSockStream, KRFCOMM); int channel; LHEL_BASE(socket.GetOpt(KRFCOMMGetAvailableServerChannel, KSolBtRFCOMM, channel), return CONNERR_GENERIC); TBTSockAddr btsockaddr; btsockaddr.SetPort(channel); LHEL_BASE(socket.Bind(btsockaddr), return CONNERR_GENERIC); socket.LocalName(btsockaddr); socket.Close(); btaddr = btsockaddr.BTAddr(); #endif //0 #endif //0//__SERIES60_3X__ storeBtAddr(btaddr, addr); return 1; } else { //TCP server return CONNERR_INTERNAL;
QString QBluetoothSocketPrivate::peerName() const { RHostResolver resolver; if(getSocketServer()->socketServer.Handle()== 0 || !iSocket || state != QBluetoothSocket::ConnectedState ) { // need to return something anyway return QString(); } TInt err = resolver.Open(getSocketServer()->socketServer, KBTAddrFamily, KBTLinkManager); if (err==KErrNone) { TNameEntry nameEntry; TBTSockAddr sockAddr; iSocket->RemoteName(sockAddr); TInquirySockAddr address(sockAddr); address.SetBTAddr(sockAddr.BTAddr()); address.SetAction(KHostResName|KHostResIgnoreCache); // ignore name stored in cache err = resolver.GetByAddress(address, nameEntry); if(err == KErrNone) { TNameRecord name = nameEntry(); QString qString((QChar*)name.iName.Ptr(),name.iName.Length()); m_peerName = qString; } } resolver.Close(); if(err != KErrNone) { // What is best? return an empty string or return the MAC address? // In Symbian if we can't get the remote name we usually replace it with the MAC address // but since Bluez implementation return an empty string we do the same here. return QString(); } return m_peerName; }
// --------------------------------------------------------------------------- // This method is for setting the sender up. // --------------------------------------------------------------------------- // void CBTAudioStreamSender::StartL(TUint aOutboundMTUSize, const TUint aFrameLength, const TUint aTargetBitrate) { BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamSender::StartL() ->"))); if(iCurrentSendPacket) { __ASSERT_DEBUG(!iCurrentSendPacket->IsOpen(),User::Invariant()); } TInt requiredPacketLength = CalculatePacketLength(aOutboundMTUSize, aFrameLength); if(requiredPacketLength > 0) { __ASSERT_DEBUG(iCurrentSendPacket, User::Invariant()); *iCurrentSendPacket = iSendSrc.NewSendPacketL(requiredPacketLength); iTargetBitrate = aTargetBitrate; InitSender(*iCurrentSendPacket, iPayloadDesC, iTargetBitrate); iStreamerState = EBuffering; BT_AUDIO_STREAMER_TRACE_OPT( KPRINTSTATE, FLOG(_L("[BTAudioStreamer]\t State changed to: EBuffering"))); } else { BT_AUDIO_STREAMER_TRACE_OPT( KPRINTSTATE, FLOG(_L("[BTAudioStreamer]\t Error! Packet length must be greater than zero!"))); User::Leave(KErrArgument); } // Streaming started, optimise the ACL link if optimiser service is available. if(iLinkOptimiserAvailable) { // The below code is to get the connected device's BT Address. TBTSockAddr addr; iRtpSession.RtpSocket()->RemoteName(addr); TUint accessLatency = MaxFramesPerPacket() * CalculateFrameDuration(aFrameLength, aTargetBitrate); // Not checking the return code, because it doesn't matter if it fails. iA2DPOptimiser.OptimiseAclForAudioStreaming(addr.BTAddr(), aTargetBitrate, accessLatency); } BT_AUDIO_STREAMER_TRACE_OPT( KPRINTFTRACE, FLOG(_L("[BTAudioStreamer]\t CBTAudioStreamSender::StartL() <-"))); }
//*************************************************************************** //Helpers //*************************************************************************** static void CopyAddr(const TBTSockAddr& aAddr, void* dst) { const TBTDevAddr& devAddr(aAddr.BTAddr()); const TPtrC8 devPtrC8(devAddr.Des()); DEBUG_ASSERT(devPtrC8.Length() == BTADDR_LEN); memcpy(dst, devPtrC8.Ptr(), BTADDR_LEN); }