transport_update_playing(transport, FALSE);
}
-static int media_transport_init_source(struct media_transport *transport)
-{
- struct btd_service *service;
- struct a2dp_transport *a2dp;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+#define AVC_MAX_VOLUME 127
+#define AVC_INITIAL_MAX_VOLUME (AVC_MAX_VOLUME * 3 / 5 + 1)
+#define DEVICE_MAX_VOLUME 150
+#define DEVICE_INITIAL_MAX_VOLUME (DEVICE_MAX_VOLUME * 3 / 5)
+
+static void media_transport_init_volume(struct media_transport *transport) {
+ struct a2dp_transport *a2dp = transport->data;
uint8_t vol = 0;
int ret;
+
+ ret = avrcp_get_target_volume(transport->device, &vol);
+
+ if (ret) /* not support AVC */
+ return;
+
+ if (vol > AVC_MAX_VOLUME)
+ return;
+
+ a2dp->volume = vol;
+
+ /* Ear-shock issue */
+ if (a2dp->volume > AVC_INITIAL_MAX_VOLUME) {
+ a2dp->volume = AVC_INITIAL_MAX_VOLUME;
+ avrcp_set_volume(transport->device, AVC_INITIAL_MAX_VOLUME, 0x00);
+ }
+
+ DBG("Get AVC volume from controller : volume [%d])", a2dp->volume);
+}
#endif
+
+static int media_transport_init_source(struct media_transport *transport)
+{
+ struct btd_service *service;
+ struct a2dp_transport *a2dp;
+
service = btd_device_get_service(transport->device, A2DP_SINK_UUID);
if (service == NULL)
return -EINVAL;
transport->data = a2dp;
transport->destroy = destroy_a2dp;
-#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
- ret = avrcp_get_target_volume(transport->device, &vol);
-
- if (!ret) /* error none */
- a2dp->volume = vol;
- else
a2dp->volume = -1;
- DBG("Check AVRCP volume and update it (ret [%d] vol [%d])", ret, vol);
-#else
- a2dp->volume = -1;
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ media_transport_init_volume(transport);
#endif
+
transport->sink_watch = sink_add_state_cb(service, sink_state_changed,
transport);