From f0fda4d6f7b002caf7c9c335bfd8dc45bcaf36c3 Mon Sep 17 00:00:00 2001 From: smartbao Date: Wed, 16 Mar 2022 22:53:15 +0800 Subject: [PATCH] fix no sound issue when music playback Signed-off-by: smartbao --- .../sbccodecctrl/include/a2dp_encoder_sbc.h | 2 + .../sbccodecctrl/src/a2dp_encoder_sbc.cpp | 74 ++++++++++++------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/include/a2dp_encoder_sbc.h b/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/include/a2dp_encoder_sbc.h index 2049d6d7..5b9742ae 100644 --- a/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/include/a2dp_encoder_sbc.h +++ b/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/include/a2dp_encoder_sbc.h @@ -151,6 +151,8 @@ private: void ConvertBitpoolParamToSBCParam(void); void EnqueuePacket(Packet *pkt, size_t frames, const uint32_t bytes, uint32_t timeStamp, const uint16_t frameSize) const; + void EnqueuePacketFragment(Packet *pkt, + size_t frames, const uint32_t bytes, uint32_t timeStamp, const uint16_t frameSize) const; A2dpSbcEncoderCb a2dpSbcEncoderCb_ {}; bool isFirstTimeToReadData_ = false; DISALLOW_COPY_AND_ASSIGN(A2dpSbcEncoder); diff --git a/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/src/a2dp_encoder_sbc.cpp b/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/src/a2dp_encoder_sbc.cpp index b88f80df..d377e26b 100755 --- a/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/src/a2dp_encoder_sbc.cpp +++ b/services/bluetooth_standard/service/src/gavdp/a2dp_codec/sbccodecctrl/src/a2dp_encoder_sbc.cpp @@ -529,48 +529,66 @@ void A2dpSbcEncoder::A2dpSbcEncodeFrames(void) void A2dpSbcEncoder::EnqueuePacket( Packet *pkt, size_t frames, const uint32_t bytes, uint32_t timeStamp, const uint16_t frameSize) const { - LOG_INFO("[EnqueuePacket][frameSize:%hu][FrameNum:%zu], mtu[%hu]", frameSize, frames, a2dpSbcEncoderCb_.mtuSize); - - LOG_INFO("[EnqueuePacket] totalSize[%u]", PacketSize(pkt)); - uint16_t blocksXsubbands - = a2dpSbcEncoderCb_.sbcEncoderParams.subBands * a2dpSbcEncoderCb_.sbcEncoderParams.numOfBlocks; - + LOG_INFO("[EnqueuePacket][frameSize:%hu][FrameNum:%zu], mtu[%hu], totalSize[%u]", + frameSize, frames, a2dpSbcEncoderCb_.mtuSize, PacketSize(pkt)); if (PacketSize(pkt) < static_cast(a2dpSbcEncoderCb_.mtuSize)) { Buffer *header = PacketHead(pkt); uint8_t *p = static_cast(BufferPtr(header)); *p = frames; observer_->EnqueuePacket(pkt, frames, bytes, timeStamp); // Enqueue Packet. } else { - int8_t count = 1; - uint32_t pktLen = 0; - uint8_t frameNum = 0; - if ((static_cast(frames) / FRAGMENT_SIZE_TWO + 1) * frameSize < (a2dpSbcEncoderCb_.mtuSize)) { - count = FRAGMENT_SIZE_TWO; - pktLen = (frames / count) * frameSize; - } else { - count = FRAGMENT_SIZE_THREE; - pktLen = (frames / count) * frameSize; - if (pktLen > static_cast(a2dpSbcEncoderCb_.mtuSize) || - (frames - frames / count * FRAGMENT_SIZE_TWO) * frameSize > - static_cast(a2dpSbcEncoderCb_.mtuSize)) { - LOG_ERROR("mtu size isn't enough.[frameSize:%u] mtu[%u]", pktLen, a2dpSbcEncoderCb_.mtuSize); - } + EnqueuePacketFragment(pkt, frames, bytes, timeStamp, frameSize); + } +} + +void A2dpSbcEncoder::EnqueuePacketFragment( + Packet *pkt, size_t frames, const uint32_t bytes, uint32_t timeStamp, const uint16_t frameSize) const +{ + int8_t count = 1; + uint32_t pktLen = 0; + uint8_t frameNum = 0; + uint16_t blocksXsubbands + = a2dpSbcEncoderCb_.sbcEncoderParams.subBands * a2dpSbcEncoderCb_.sbcEncoderParams.numOfBlocks; + bool frameFragmented = false; + if ((static_cast(frames) / FRAGMENT_SIZE_TWO + 1) * frameSize < (a2dpSbcEncoderCb_.mtuSize)) { + count = FRAGMENT_SIZE_TWO; + pktLen = (frames / count) * frameSize; + } else { + count = FRAGMENT_SIZE_THREE; + pktLen = (frames / count) * frameSize; + if (pktLen > static_cast(a2dpSbcEncoderCb_.mtuSize) || + (frames - frames / count * FRAGMENT_SIZE_TWO) * frameSize > + static_cast(a2dpSbcEncoderCb_.mtuSize)) { + frameFragmented = true; + LOG_ERROR("mtu size isn't enough.[frameSize:%u] mtu[%u]", pktLen, a2dpSbcEncoderCb_.mtuSize); } - frameNum = frames / count; - LOG_INFO("[EnqueuePacket][FragmentNum:%u][FrameNum:%u]", count, frameNum); + } + frameNum = frames / count; + if (!frameFragmented) { + size_t remainFrames = frames; + uint16_t offset = 0; do { - Packet *mediaPacket = PacketMalloc(0, 0, 0); + Packet *mediaPacket = PacketMalloc(A2DP_SBC_FRAGMENT_HEADER, 0, 0); if (count == 1) { - frameNum = frames; + frameNum = remainFrames; pktLen = frameNum * frameSize; } count--; LOG_INFO("[EnqueuePacket] [pktLen:%u] [sFrameNum:%u] [remain:%u]", pktLen, frameNum, PacketSize(pkt)); - PacketFragment(pkt, mediaPacket, pktLen); - frames = frames - frameNum; - observer_->EnqueuePacket(mediaPacket, frameNum, pktLen, timeStamp-frames * blocksXsubbands); + Buffer *header = PacketHead(mediaPacket); + uint8_t *p = static_cast(BufferPtr(header)); + *p = frameNum; + uint8_t bufferFra[1024]; + size_t encoded = pktLen; + PacketPayloadRead(pkt, bufferFra, offset, pktLen); + offset += pktLen; + Buffer *encBuf = BufferMalloc(encoded); + (void)memcpy_s(BufferPtr(encBuf), encoded, bufferFra, encoded); + PacketPayloadAddLast(mediaPacket, encBuf); + BufferFree(encBuf); + remainFrames = remainFrames - frameNum; + observer_->EnqueuePacket(mediaPacket, frameNum, pktLen, timeStamp - remainFrames * blocksXsubbands); PacketFree(mediaPacket); - LOG_INFO("[EnqueuePacket][sendNum:%u][remainFrameNum:%zu], [DataLen:%u]", frameNum, frames, pktLen); } while (count > 0); } } -- Gitee