1616#include <stdio.h>
1717#include <zephyr/types.h>
1818#include <zephyr/sys/atomic.h>
19+ #include <zephyr/sys/byteorder.h>
1920#include <zephyr/sys/util.h>
2021
2122#include <zephyr/bluetooth/bluetooth.h>
@@ -124,10 +125,14 @@ static ssize_t read_icon_id(struct bt_conn *conn,
124125 uint16_t len , uint16_t offset )
125126{
126127 uint64_t icon_id = media_proxy_sctrl_get_icon_id ();
128+ uint8_t icon_id_le [BT_OTS_OBJ_ID_SIZE ];
129+
130+ sys_put_le48 (icon_id , icon_id_le );
127131
128132 LOG_DBG_OBJ_ID ("Icon object read: " , icon_id );
129- return bt_gatt_attr_read (conn , attr , buf , len , offset , & icon_id ,
130- BT_OTS_OBJ_ID_SIZE );
133+
134+ return bt_gatt_attr_read (conn , attr , buf , len , offset , icon_id_le ,
135+ sizeof (icon_id_le ));
131136}
132137#endif /* CONFIG_BT_OTS */
133138
@@ -186,13 +191,14 @@ static ssize_t read_track_duration(struct bt_conn *conn,
186191{
187192 struct client_state * client = & clients [bt_conn_index (conn )];
188193 int32_t duration = media_proxy_sctrl_get_track_duration ();
194+ int32_t duration_le = sys_cpu_to_le32 (duration );
189195
190196 LOG_DBG ("Track duration read: %d (0x%08x)" , duration , duration );
191197
192198 atomic_clear_bit (client -> flags , FLAG_TRACK_DURATION_CHANGED );
193199
194- return bt_gatt_attr_read (conn , attr , buf , len , offset , & duration ,
195- sizeof (duration ));
200+ return bt_gatt_attr_read (conn , attr , buf , len , offset , & duration_le ,
201+ sizeof (duration_le ));
196202}
197203
198204static void track_duration_cfg_changed (const struct bt_gatt_attr * attr ,
@@ -207,13 +213,14 @@ static ssize_t read_track_position(struct bt_conn *conn,
207213{
208214 struct client_state * client = & clients [bt_conn_index (conn )];
209215 int32_t position = media_proxy_sctrl_get_track_position ();
216+ int32_t position_le = sys_cpu_to_le32 (position );
210217
211218 LOG_DBG ("Track position read: %d (0x%08x)" , position , position );
212219
213220 atomic_clear_bit (client -> flags , FLAG_TRACK_POSITION_CHANGED );
214221
215- return bt_gatt_attr_read (conn , attr , buf , len , offset , & position ,
216- sizeof (position ));
222+ return bt_gatt_attr_read (conn , attr , buf , len , offset , & position_le ,
223+ sizeof (position_le ));
217224}
218225
219226static ssize_t write_track_position (struct bt_conn * conn ,
@@ -226,11 +233,12 @@ static ssize_t write_track_position(struct bt_conn *conn,
226233 if (offset != 0 ) {
227234 return BT_GATT_ERR (BT_ATT_ERR_INVALID_OFFSET );
228235 }
236+
229237 if (len != sizeof (position )) {
230238 return BT_GATT_ERR (BT_ATT_ERR_INVALID_ATTRIBUTE_LEN );
231239 }
232240
233- memcpy ( & position , buf , len );
241+ position = sys_get_le32 (( uint8_t * ) buf );
234242
235243 media_proxy_sctrl_set_track_position (position );
236244
@@ -316,10 +324,14 @@ static ssize_t read_track_segments_id(struct bt_conn *conn,
316324 void * buf , uint16_t len , uint16_t offset )
317325{
318326 uint64_t track_segments_id = media_proxy_sctrl_get_track_segments_id ();
327+ uint8_t track_segments_id_le [BT_OTS_OBJ_ID_SIZE ];
328+
329+ sys_put_le48 (track_segments_id , track_segments_id_le );
319330
320331 LOG_DBG_OBJ_ID ("Track segments ID read: " , track_segments_id );
332+
321333 return bt_gatt_attr_read (conn , attr , buf , len , offset ,
322- & track_segments_id , BT_OTS_OBJ_ID_SIZE );
334+ track_segments_id_le , sizeof ( track_segments_id_le ) );
323335}
324336
325337static ssize_t read_current_track_id (struct bt_conn * conn ,
@@ -328,13 +340,16 @@ static ssize_t read_current_track_id(struct bt_conn *conn,
328340{
329341 struct client_state * client = & clients [bt_conn_index (conn )];
330342 uint64_t track_id = media_proxy_sctrl_get_current_track_id ();
343+ uint8_t track_id_le [BT_OTS_OBJ_ID_SIZE ];
344+
345+ sys_put_le48 (track_id , track_id_le );
331346
332347 LOG_DBG_OBJ_ID ("Current track ID read: " , track_id );
333348
334349 atomic_clear_bit (client -> flags , FLAG_CURRENT_TRACK_OBJ_ID_CHANGED );
335350
336- return bt_gatt_attr_read (conn , attr , buf , len , offset , & track_id ,
337- BT_OTS_OBJ_ID_SIZE );
351+ return bt_gatt_attr_read (conn , attr , buf , len , offset , track_id_le ,
352+ sizeof ( track_id_le ) );
338353}
339354
340355static ssize_t write_current_track_id (struct bt_conn * conn ,
@@ -379,6 +394,9 @@ static ssize_t read_next_track_id(struct bt_conn *conn,
379394{
380395 struct client_state * client = & clients [bt_conn_index (conn )];
381396 uint64_t track_id = media_proxy_sctrl_get_next_track_id ();
397+ uint8_t track_id_le [BT_OTS_OBJ_ID_SIZE ];
398+
399+ sys_put_le48 (track_id , track_id_le );
382400
383401 atomic_clear_bit (client -> flags , FLAG_NEXT_TRACK_OBJ_ID_CHANGED );
384402
@@ -391,7 +409,7 @@ static ssize_t read_next_track_id(struct bt_conn *conn,
391409
392410 LOG_DBG_OBJ_ID ("Next track read: " , track_id );
393411 return bt_gatt_attr_read (conn , attr , buf , len , offset ,
394- & track_id , BT_OTS_OBJ_ID_SIZE );
412+ track_id_le , sizeof ( track_id_le ) );
395413}
396414
397415static ssize_t write_next_track_id (struct bt_conn * conn ,
@@ -436,13 +454,16 @@ static ssize_t read_parent_group_id(struct bt_conn *conn,
436454{
437455 struct client_state * client = & clients [bt_conn_index (conn )];
438456 uint64_t group_id = media_proxy_sctrl_get_parent_group_id ();
457+ uint8_t group_id_le [BT_OTS_OBJ_ID_SIZE ];
458+
459+ sys_put_le48 (group_id , group_id_le );
439460
440461 LOG_DBG_OBJ_ID ("Parent group read: " , group_id );
441462
442463 atomic_clear_bit (client -> flags , FLAG_PARENT_GROUP_OBJ_ID_CHANGED );
443464
444- return bt_gatt_attr_read (conn , attr , buf , len , offset , & group_id ,
445- BT_OTS_OBJ_ID_SIZE );
465+ return bt_gatt_attr_read (conn , attr , buf , len , offset , group_id_le ,
466+ sizeof ( group_id_le ) );
446467}
447468
448469static void parent_group_id_cfg_changed (const struct bt_gatt_attr * attr ,
@@ -457,13 +478,16 @@ static ssize_t read_current_group_id(struct bt_conn *conn,
457478{
458479 struct client_state * client = & clients [bt_conn_index (conn )];
459480 uint64_t group_id = media_proxy_sctrl_get_current_group_id ();
481+ uint8_t group_id_le [BT_OTS_OBJ_ID_SIZE ];
482+
483+ sys_put_le48 (group_id , group_id_le );
460484
461485 LOG_DBG_OBJ_ID ("Current group read: " , group_id );
462486
463487 atomic_clear_bit (client -> flags , FLAG_CURRENT_GROUP_OBJ_ID_CHANGED );
464488
465- return bt_gatt_attr_read (conn , attr , buf , len , offset , & group_id ,
466- BT_OTS_OBJ_ID_SIZE );
489+ return bt_gatt_attr_read (conn , attr , buf , len , offset , group_id_le ,
490+ sizeof ( group_id_le ) );
467491}
468492
469493static ssize_t write_current_group_id (struct bt_conn * conn ,
@@ -554,11 +578,12 @@ static ssize_t read_playing_orders_supported(struct bt_conn *conn,
554578 void * buf , uint16_t len , uint16_t offset )
555579{
556580 uint16_t orders = media_proxy_sctrl_get_playing_orders_supported ();
581+ uint16_t orders_le = sys_cpu_to_le16 (orders );
557582
558583 LOG_DBG ("Playing orders read: %d (0x%04x)" , orders , orders );
559584
560- return bt_gatt_attr_read (conn , attr , buf , len , offset , & orders ,
561- sizeof (orders ));
585+ return bt_gatt_attr_read (conn , attr , buf , len , offset , & orders_le ,
586+ sizeof (orders_le ));
562587}
563588
564589static ssize_t read_media_state (struct bt_conn * conn ,
@@ -630,9 +655,7 @@ static ssize_t write_control_point(struct bt_conn *conn,
630655 }
631656
632657 if (len == sizeof (command .opcode ) + sizeof (command .param )) {
633- memcpy (& command .param ,
634- (char * )buf + sizeof (command .opcode ),
635- sizeof (command .param ));
658+ command .param = sys_get_le32 ((char * )buf + sizeof (command .opcode ));
636659 command .use_param = true;
637660 LOG_DBG ("Parameter: %d" , command .param );
638661 }
@@ -654,13 +677,14 @@ static ssize_t read_opcodes_supported(struct bt_conn *conn,
654677{
655678 struct client_state * client = & clients [bt_conn_index (conn )];
656679 uint32_t opcodes = media_proxy_sctrl_get_commands_supported ();
680+ uint32_t opcodes_le = sys_cpu_to_le32 (opcodes );
657681
658682 LOG_DBG ("Opcodes_supported read: %d (0x%08x)" , opcodes , opcodes );
659683
660684 atomic_clear_bit (client -> flags , FLAG_MEDIA_CONTROL_OPCODES_CHANGED );
661685
662686 return bt_gatt_attr_read (conn , attr , buf , len , offset ,
663- & opcodes , BT_MCS_OPCODES_SUPPORTED_LEN );
687+ & opcodes_le , sizeof ( opcodes_le ) );
664688}
665689
666690static void opcodes_supported_cfg_changed (const struct bt_gatt_attr * attr ,
@@ -736,8 +760,12 @@ static ssize_t read_search_results_id(struct bt_conn *conn,
736760 return bt_gatt_attr_read (conn , attr , buf , len , offset ,
737761 NULL , 0 );
738762 } else {
763+ uint8_t search_id_le [BT_OTS_OBJ_ID_SIZE ];
764+
765+ sys_put_le48 (search_id , search_id_le );
766+
739767 return bt_gatt_attr_read (conn , attr , buf , len , offset ,
740- & search_id , BT_OTS_OBJ_ID_SIZE );
768+ & search_id_le , sizeof ( search_id_le ) );
741769 }
742770}
743771
@@ -993,16 +1021,18 @@ static void notify_cb(struct bt_conn *conn, void *data)
9931021
9941022 if (atomic_test_and_clear_bit (client -> flags , FLAG_TRACK_DURATION_CHANGED )) {
9951023 int32_t duration = media_proxy_sctrl_get_track_duration ();
1024+ int32_t duration_le = sys_cpu_to_le32 (duration );
9961025
9971026 LOG_DBG ("Notifying track duration: %d" , duration );
998- notify (BT_UUID_MCS_TRACK_DURATION , & duration , sizeof (duration ));
1027+ notify (BT_UUID_MCS_TRACK_DURATION , & duration_le , sizeof (duration_le ));
9991028 }
10001029
10011030 if (atomic_test_and_clear_bit (client -> flags , FLAG_TRACK_POSITION_CHANGED )) {
10021031 int32_t position = media_proxy_sctrl_get_track_position ();
1032+ int32_t position_le = sys_cpu_to_le32 (position );
10031033
10041034 LOG_DBG ("Notifying track position: %d" , position );
1005- notify (BT_UUID_MCS_TRACK_POSITION , & position , sizeof (position ));
1035+ notify (BT_UUID_MCS_TRACK_POSITION , & position_le , sizeof (position_le ));
10061036 }
10071037
10081038 if (atomic_test_and_clear_bit (client -> flags , FLAG_PLAYBACK_SPEED_CHANGED )) {
@@ -1022,9 +1052,12 @@ static void notify_cb(struct bt_conn *conn, void *data)
10221052#if defined(CONFIG_BT_OTS )
10231053 if (atomic_test_and_clear_bit (client -> flags , FLAG_CURRENT_TRACK_OBJ_ID_CHANGED )) {
10241054 uint64_t track_id = media_proxy_sctrl_get_current_track_id ();
1055+ uint8_t track_id_le [BT_OTS_OBJ_ID_SIZE ];
1056+
1057+ sys_put_le48 (track_id , track_id_le );
10251058
10261059 LOG_DBG_OBJ_ID ("Notifying current track ID: " , track_id );
1027- notify (BT_UUID_MCS_CURRENT_TRACK_OBJ_ID , & track_id , BT_OTS_OBJ_ID_SIZE );
1060+ notify (BT_UUID_MCS_CURRENT_TRACK_OBJ_ID , track_id_le , sizeof ( track_id_le ) );
10281061 }
10291062
10301063 if (atomic_test_and_clear_bit (client -> flags , FLAG_NEXT_TRACK_OBJ_ID_CHANGED )) {
@@ -1037,23 +1070,33 @@ static void notify_cb(struct bt_conn *conn, void *data)
10371070 LOG_DBG_OBJ_ID ("Notifying EMPTY next track ID: " , track_id );
10381071 notify (BT_UUID_MCS_NEXT_TRACK_OBJ_ID , NULL , 0 );
10391072 } else {
1073+ uint8_t track_id_le [BT_OTS_OBJ_ID_SIZE ];
1074+
1075+ sys_put_le48 (track_id , track_id_le );
1076+
10401077 LOG_DBG_OBJ_ID ("Notifying next track ID: " , track_id );
1041- notify (BT_UUID_MCS_NEXT_TRACK_OBJ_ID , & track_id , BT_OTS_OBJ_ID_SIZE );
1078+ notify (BT_UUID_MCS_NEXT_TRACK_OBJ_ID , track_id_le , sizeof ( track_id_le ) );
10421079 }
10431080 }
10441081
10451082 if (atomic_test_and_clear_bit (client -> flags , FLAG_PARENT_GROUP_OBJ_ID_CHANGED )) {
10461083 uint64_t group_id = media_proxy_sctrl_get_parent_group_id ();
1084+ uint8_t group_id_le [BT_OTS_OBJ_ID_SIZE ];
1085+
1086+ sys_put_le48 (group_id , group_id_le );
10471087
10481088 LOG_DBG_OBJ_ID ("Notifying parent group ID: " , group_id );
1049- notify (BT_UUID_MCS_PARENT_GROUP_OBJ_ID , & group_id , BT_OTS_OBJ_ID_SIZE );
1089+ notify (BT_UUID_MCS_PARENT_GROUP_OBJ_ID , & group_id_le , sizeof ( group_id_le ) );
10501090 }
10511091
10521092 if (atomic_test_and_clear_bit (client -> flags , FLAG_CURRENT_GROUP_OBJ_ID_CHANGED )) {
10531093 uint64_t group_id = media_proxy_sctrl_get_current_group_id ();
1094+ uint8_t group_id_le [BT_OTS_OBJ_ID_SIZE ];
1095+
1096+ sys_put_le48 (group_id , group_id_le );
10541097
10551098 LOG_DBG_OBJ_ID ("Notifying current group ID: " , group_id );
1056- notify (BT_UUID_MCS_CURRENT_GROUP_OBJ_ID , & group_id , BT_OTS_OBJ_ID_SIZE );
1099+ notify (BT_UUID_MCS_CURRENT_GROUP_OBJ_ID , & group_id_le , sizeof ( group_id_le ) );
10571100 }
10581101#endif /* CONFIG_BT_OTS */
10591102
@@ -1078,17 +1121,21 @@ static void notify_cb(struct bt_conn *conn, void *data)
10781121
10791122 if (atomic_test_and_clear_bit (client -> flags , FLAG_MEDIA_CONTROL_OPCODES_CHANGED )) {
10801123 uint32_t opcodes = media_proxy_sctrl_get_commands_supported ();
1124+ uint32_t opcodes_le = sys_cpu_to_le32 (opcodes );
10811125
10821126 LOG_DBG ("Notifying command opcodes supported: %d (0x%08x)" , opcodes , opcodes );
1083- notify (BT_UUID_MCS_MEDIA_CONTROL_OPCODES , & opcodes , BT_MCS_OPCODES_SUPPORTED_LEN );
1127+ notify (BT_UUID_MCS_MEDIA_CONTROL_OPCODES , & opcodes_le , sizeof ( opcodes_le ) );
10841128 }
10851129
10861130#if defined(CONFIG_BT_OTS )
10871131 if (atomic_test_and_clear_bit (client -> flags , FLAG_SEARCH_RESULTS_OBJ_ID_CHANGED )) {
10881132 uint64_t search_id = media_proxy_sctrl_get_search_results_id ();
1133+ uint8_t search_id_le [BT_OTS_OBJ_ID_SIZE ];
1134+
1135+ sys_put_le48 (search_id , search_id_le );
10891136
10901137 LOG_DBG_OBJ_ID ("Notifying search results ID: " , search_id );
1091- notify (BT_UUID_MCS_SEARCH_RESULTS_OBJ_ID , & search_id , BT_OTS_OBJ_ID_SIZE );
1138+ notify (BT_UUID_MCS_SEARCH_RESULTS_OBJ_ID , & search_id_le , sizeof ( search_id_le ) );
10921139 }
10931140
10941141 if (atomic_test_and_clear_bit (client -> flags , FLAG_SEARCH_CONTROL_POINT_RESULT )) {
0 commit comments