Guest User

Untitled

a guest
Dec 11th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.14 KB | None | 0 0
  1. diff --git a/audio/control.c b/audio/control.c
  2. index 3c7f3e8..63400e7 100755
  3. --- a/audio/control.c
  4. +++ b/audio/control.c
  5. @@ -778,7 +778,7 @@ static gboolean control_cb(GIOChannel *chan, GIOCondition cond,
  6. packet_size = packet_size + 4;
  7. } else if (caps->capability_id == CAP_EVENTS_SUPPORTED_ID) {
  8. avrcp->code = CTYPE_STABLE;
  9. - caps->params.param_len = htons(4);
  10. + caps->params.param_len = htons(6); // why?
  11. operands[0] = 0x2; // Capability Count
  12. operands[1] = EVENT_PLAYBACK_STATUS_CHANGED;
  13. operands[2] = EVENT_TRACK_CHANGED;
  14. @@ -1737,13 +1737,12 @@ static int send_meta_data_continue_response(struct control *control,
  15. {
  16. struct meta_data *mdata = control->mdata;
  17. int header_len = sizeof(struct avrcp_params);
  18. - int meta_data_len = mdata->remaining_mdata_len + header_len;
  19. - unsigned char buf[meta_data_len];
  20. + int meta_data_len = mdata->remaining_mdata_len;
  21. + unsigned char buf[meta_data_len + header_len];
  22. struct avrcp_params *params = (struct avrcp_params *) buf;
  23. struct avrcp_header *avrcp = &params->avrcp;
  24. struct avctp_header *avctp = &avrcp->avctp;
  25. - struct meta_data_field *mdata_field = (struct meta_data_field *) &buf[header_len];
  26. - int len = 0, total_len = 0, sk = g_io_channel_unix_get_fd(control->io);
  27. + int sk = g_io_channel_unix_get_fd(control->io);
  28.  
  29. memset(buf, 0, sizeof(buf));
  30.  
  31. @@ -1758,32 +1757,29 @@ static int send_meta_data_continue_response(struct control *control,
  32.  
  33. set_company_id(params->company_id, IEEEID_BTSIG);
  34. params->pdu_id = PDU_GET_ELEMENT_ATTRIBUTES;
  35. - params->packet_type = AVCTP_PACKET_END;
  36.  
  37. memcpy(buf + header_len, mdata->remaining_mdata, mdata->remaining_mdata_len);
  38. - g_free(mdata->remaining_mdata);
  39. - mdata->remaining_mdata = NULL;
  40. - mdata->remaining_mdata_len = 0;
  41.  
  42. - if (meta_data_len > AVRCP_MAX_PKT_SIZE) {
  43. - len = AVRCP_MAX_PKT_SIZE - header_len + sizeof(struct avctp_header);
  44. - params->param_len = htons(len);
  45. - total_len = AVRCP_MAX_PKT_SIZE + sizeof(struct avctp_header);
  46. + if (meta_data_len + header_len - sizeof(struct avctp_header) > AVRCP_MAX_PKT_SIZE) {
  47. + int possible_len = AVRCP_MAX_PKT_SIZE - header_len + sizeof(struct avctp_header); // +1?
  48. +
  49. + memcpy(mdata->remaining_mdata, buf + header_len + possible_len,
  50. + mdata->remaining_mdata_len - possible_len);
  51. + mdata->remaining_mdata_len -= possible_len;
  52. +
  53. params->packet_type = AVCTP_PACKET_CONTINUE;
  54. - meta_data_len -= len;
  55. - mdata->remaining_mdata = g_new0(gchar, meta_data_len);
  56. - if (!(mdata->remaining_mdata)) {
  57. - return -ENOMEM;
  58. - }
  59. - mdata->remaining_mdata_len = meta_data_len;
  60. - len = AVRCP_MAX_PKT_SIZE + sizeof(struct avctp_header);
  61. - memcpy(mdata->remaining_mdata, buf + len, meta_data_len);
  62. + meta_data_len = possible_len;
  63. } else {
  64. - params->param_len = htons(meta_data_len - header_len + 1);
  65. - total_len = meta_data_len;
  66. + params->packet_type = AVCTP_PACKET_END;
  67. +
  68. + g_free(mdata->remaining_mdata);
  69. + mdata->remaining_mdata = NULL;
  70. + mdata->remaining_mdata_len = 0;
  71. }
  72.  
  73. - return write(sk, buf, total_len);
  74. + params->param_len = htons(meta_data_len);
  75. +
  76. + return write(sk, buf, meta_data_len + header_len);
  77. }
  78.  
  79. static int send_meta_data(struct control *control, uint8_t trans_id,
  80. @@ -1791,11 +1787,12 @@ static int send_meta_data(struct control *control, uint8_t trans_id,
  81. {
  82. struct meta_data *mdata = control->mdata;
  83. int header_len = sizeof(struct avrcp_caps);
  84. + /* calculate for the worst case */
  85. int meta_data_len = strlen(mdata->title) + strlen(mdata->artist) +
  86. strlen(mdata->album) + strlen(mdata->media_number) +
  87. strlen(mdata->total_media_count) + strlen(mdata->playing_time) +
  88. - (sizeof(struct meta_data_field) * att_count) + header_len;
  89. - unsigned char buf[meta_data_len];
  90. + (sizeof(struct meta_data_field) * att_count);
  91. + unsigned char buf[meta_data_len + header_len];
  92. struct avrcp_caps *caps = (struct avrcp_caps *) buf;
  93. struct avrcp_params *params = &caps->params;
  94. struct avrcp_header *avrcp = &params->avrcp;
  95. @@ -1818,10 +1815,10 @@ static int send_meta_data(struct control *control, uint8_t trans_id,
  96. set_company_id(params->company_id, IEEEID_BTSIG);
  97. params->pdu_id = PDU_GET_ELEMENT_ATTRIBUTES;
  98. params->packet_type = AVCTP_PACKET_SINGLE;
  99. - meta_data_len = sizeof(struct meta_data_field) * att_count;
  100. caps->capability_id = att_count;
  101. DBG("Att mask is %d", att_mask);
  102.  
  103. + meta_data_len = sizeof(struct meta_data_field) * att_count;
  104. op = (uint8_t *) mdata_field;
  105.  
  106. if (att_mask & (1 << (METADATA_TITLE - 1))) {
  107. @@ -1899,25 +1896,25 @@ static int send_meta_data(struct control *control, uint8_t trans_id,
  108. meta_data_len += len;
  109. }
  110. if ((meta_data_len + header_len - sizeof(struct avctp_header)) > AVRCP_MAX_PKT_SIZE) {
  111. - DBG("meta len is %d header len is %d", meta_data_len, header_len);
  112. - len = AVRCP_MAX_PKT_SIZE - sizeof(struct avrcp_params) + sizeof(struct avctp_header);
  113. - params->param_len = htons(len);
  114. - total_len = AVRCP_MAX_PKT_SIZE + sizeof(struct avctp_header);
  115. + int possible_len = AVRCP_MAX_PKT_SIZE - header_len + sizeof(struct avctp_header);
  116. + DBG("meta len is %d header len is %d -> possible %d", meta_data_len, header_len, possible_len);
  117. +
  118. params->packet_type = AVCTP_PACKET_START;
  119. - meta_data_len = meta_data_len - len + 1;
  120. - mdata->remaining_mdata = g_new0(gchar, meta_data_len);
  121. +
  122. + mdata->remaining_mdata = g_new0(gchar, meta_data_len - possible_len);
  123. if (!(mdata->remaining_mdata)) {
  124. return -ENOMEM;
  125. }
  126. - mdata->remaining_mdata_len = meta_data_len;
  127. + mdata->remaining_mdata_len = meta_data_len - possible_len;
  128. DBG("Remain meta data len is %d", mdata->remaining_mdata_len);
  129. - len = AVRCP_MAX_PKT_SIZE + sizeof(struct avctp_header);
  130. - memcpy(mdata->remaining_mdata, &buf[len], meta_data_len);
  131. - } else {
  132. - params->param_len = htons(meta_data_len);
  133. - total_len = meta_data_len + header_len;
  134. +
  135. + memcpy(mdata->remaining_mdata, buf + header_len + possible_len,
  136. + mdata->remaining_mdata_len);
  137. + meta_data_len = possible_len;
  138. }
  139. - return write(sk, buf, total_len);
  140. + params->param_len = htons(meta_data_len);
  141. +
  142. + return write(sk, buf, meta_data_len + header_len);
  143. }
  144.  
  145. static int send_notification(struct control *control,
Add Comment
Please, Sign In to add comment