Sometimes some stacks may set the track duration to 0 in GetItemAttributes before updating it in GetPlayStatus. Currently the track duration is updated only if it has never been set before. To fix the issue this also checks that the current value is not 0. > ACL Data RX: Handle 11 flags 0x02 dlen 102 #287 [hci0] 4.537033 Channel: 71 len 98 ctrl 0x0202 [PSM 27 mode Enhanced Retransmission (0x03)] {chan 7} I-frame: Unsegmented TxSeq 1 ReqSeq 2 AVCTP Browsing: Response: type 0x00 label 1 PID 0x110e AVRCP: GetItemAttributes: len 0x0058 ... AttributeID: 0x00000007 (Track duration) CharsetID: 0x006a (UTF-8) AttributeLength: 0x0001 (1) AttributeValue: 0 ... > ACL Data RX: Handle 11 flags 0x02 dlen 26 #296 [hci0] 4.589649 Channel: 68 len 22 [PSM 23 mode Basic (0x00)] {chan 4} AVCTP Control: Response: type 0x00 label 9 PID 0x110e AV/C: Stable: address 0x48 opcode 0x00 Subunit: Panel Opcode: Vendor Dependent Company ID: 0x001958 AVRCP: GetPlayStatus pt Single len 0x0009 SongLength: 0x000255a8 (153000 miliseconds) SongPosition: 0x00009256 (37462 miliseconds) PlayStatus: 0x02 (PAUSED) --- profiles/audio/player.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/profiles/audio/player.c b/profiles/audio/player.c index 0f72d7601..52844c9c0 100644 --- a/profiles/audio/player.c +++ b/profiles/audio/player.c @@ -1320,9 +1320,9 @@ void media_player_set_duration(struct media_player *mp, uint32_t duration) if (g_hash_table_size(mp->track) == 0) return; - /* Ignore if duration is already set */ + /* Ignore if duration is already set to value > 0 */ curval = g_hash_table_lookup(mp->track, "Duration"); - if (curval != NULL) + if (curval != NULL && atoi(curval) != 0) return; value = g_strdup_printf("%u", duration); -- 2.43.0