struct btd_device *dev = session->dev;
uint16_t len = ntohs(pdu->params_len);
uint64_t uid;
+ int8_t volume;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
uint32_t playback_interval;
uint32_t playback_position;
len = 1;
break;
case AVRCP_EVENT_VOLUME_CHANGED:
- pdu->params[1] = media_transport_get_device_volume(dev);
- if (pdu->params[1] > 127)
+ volume = media_transport_get_device_volume(dev);
+ if (volume < 0)
goto err;
+ pdu->params[1] = volume;
len = 2;
break;
uint8_t transaction)
{
uint16_t len = ntohs(pdu->params_len);
- uint8_t volume;
+ int8_t volume;
if (len != 1)
goto err;
struct avrcp_header *pdu)
{
struct avrcp_player *player = target_get_player(session);
- uint8_t volume;
+ int8_t volume;
volume = pdu->params[1] & 0x7F;
struct avrcp *session = user_data;
struct avrcp_player *player = target_get_player(session);
struct avrcp_header *pdu = (void *) operands;
- uint8_t volume;
+ int8_t volume;
if (code == AVC_CTYPE_REJECTED || code == AVC_CTYPE_NOT_IMPLEMENTED ||
pdu == NULL)
return err;
}
-int avrcp_set_volume(struct btd_device *dev, uint8_t volume, bool notify)
+int avrcp_set_volume(struct btd_device *dev, int8_t volume, bool notify)
{
struct avrcp_server *server;
struct avrcp *session;
uint8_t buf[AVRCP_HEADER_LENGTH + 1];
struct avrcp_header *pdu = (void *) buf;
+ if (volume < 0)
+ return -EINVAL;
+
server = find_server(servers, device_get_adapter(dev));
if (server == NULL)
return -EINVAL;
#define AVRCP_EVENT_LAST AVRCP_EVENT_VOLUME_CHANGED
struct avrcp_player_cb {
- GList *(*list_settings) (void *user_data);
- const char *(*get_setting) (const char *key, void *user_data);
- int (*set_setting) (const char *key, const char *value,
+ GList *(*list_settings)(void *user_data);
+ const char *(*get_setting)(const char *key, void *user_data);
+ int (*set_setting)(const char *key, const char *value,
void *user_data);
- uint64_t (*get_uid) (void *user_data);
- const char *(*get_metadata) (const char *key, void *user_data);
- GList *(*list_metadata) (void *user_data);
- const char *(*get_status) (void *user_data);
- uint32_t (*get_position) (void *user_data);
- uint32_t (*get_duration) (void *user_data);
- const char *(*get_name) (void *user_data);
- void (*set_volume) (uint8_t volume, struct btd_device *dev,
+ uint64_t (*get_uid)(void *user_data);
+ const char *(*get_metadata)(const char *key, void *user_data);
+ GList *(*list_metadata)(void *user_data);
+ const char *(*get_status)(void *user_data);
+ uint32_t (*get_position)(void *user_data);
+ uint32_t (*get_duration)(void *user_data);
+ const char *(*get_name)(void *user_data);
+ void (*set_volume)(int8_t volume, struct btd_device *dev,
void *user_data);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
uint8_t (*get_volume) (struct btd_device *dev, void *user_data);
#endif
- bool (*play) (void *user_data);
- bool (*stop) (void *user_data);
- bool (*pause) (void *user_data);
- bool (*next) (void *user_data);
- bool (*previous) (void *user_data);
+ bool (*play)(void *user_data);
+ bool (*stop)(void *user_data);
+ bool (*pause)(void *user_data);
+ bool (*next)(void *user_data);
+ bool (*previous)(void *user_data);
};
-int avrcp_set_volume(struct btd_device *dev, uint8_t volume, bool notify);
+int avrcp_set_volume(struct btd_device *dev, int8_t volume, bool notify);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
int avrcp_get_target_volume(struct btd_device *dev, uint8_t* volume);
void avrcp_player_event(struct avrcp_player *player, uint8_t id,
const void *data);
-
size_t avrcp_handle_vendor_reject(uint8_t *code, uint8_t *operands);
size_t avrcp_browsing_general_reject(uint8_t *operands);
char *status;
uint32_t position;
uint32_t duration;
- uint8_t volume;
+ int8_t volume;
GTimer *timer;
bool play;
bool pause;
return mp->duration;
}
-static void set_volume(uint8_t volume, struct btd_device *dev, void *user_data)
+static void set_volume(int8_t volume, struct btd_device *dev, void *user_data)
{
struct media_player *mp = user_data;
struct a2dp_transport {
struct avdtp *session;
uint16_t delay;
- uint16_t volume;
+ int8_t volume;
};
struct media_transport {
struct media_transport *transport = data;
struct a2dp_transport *a2dp = transport->data;
- return a2dp->volume <= 127;
+ return a2dp->volume >= 0;
}
#endif
{
struct media_transport *transport = data;
struct a2dp_transport *a2dp = transport->data;
+ uint16_t volume = (uint16_t)a2dp->volume;
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &a2dp->volume);
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &volume);
return TRUE;
}
{
struct media_transport *transport = data;
struct a2dp_transport *a2dp = transport->data;
- uint16_t volume;
+ uint16_t arg;
+ int8_t volume;
bool notify;
- if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16) {
- g_dbus_pending_property_error(id,
- ERROR_INTERFACE ".InvalidArguments",
- "Invalid arguments in method call");
- return;
- }
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16)
+ goto error;
- dbus_message_iter_get_basic(iter, &volume);
-
- if (volume > 127) {
- g_dbus_pending_property_error(id,
- ERROR_INTERFACE ".InvalidArguments",
- "Invalid arguments in method call");
- return;
- }
+ dbus_message_iter_get_basic(iter, &arg);
+ if (arg > INT8_MAX)
+ goto error;
g_dbus_pending_property_success(id);
+ volume = (int8_t)arg;
if (a2dp->volume == volume)
return;
"Volume");
avrcp_set_volume(transport->device, volume, notify);
+ return;
+
+error:
+ g_dbus_pending_property_error(id, ERROR_INTERFACE ".InvalidArguments",
+ "Invalid arguments in method call");
}
static gboolean endpoint_exists(const GDBusPropertyTable *property, void *data)
return transport->device;
}
-uint16_t media_transport_get_volume(struct media_transport *transport)
+int8_t media_transport_get_volume(struct media_transport *transport)
{
struct a2dp_transport *a2dp = transport->data;
return a2dp->volume;
#endif
void media_transport_update_volume(struct media_transport *transport,
- uint8_t volume)
+ int8_t volume)
{
struct a2dp_transport *a2dp = transport->data;
#endif
}
-uint8_t media_transport_get_device_volume(struct btd_device *dev)
+int8_t media_transport_get_device_volume(struct btd_device *dev)
{
GSList *l;
if (dev == NULL)
- return 128;
+ return -1;
for (l = transports; l; l = l->next) {
struct media_transport *transport = l->data;
}
void media_transport_update_device_volume(struct btd_device *dev,
- uint8_t volume)
+ int8_t volume)
{
GSList *l;
void media_transport_destroy(struct media_transport *transport);
const char *media_transport_get_path(struct media_transport *transport);
struct btd_device *media_transport_get_dev(struct media_transport *transport);
-uint16_t media_transport_get_volume(struct media_transport *transport);
+int8_t media_transport_get_volume(struct media_transport *transport);
void media_transport_update_delay(struct media_transport *transport,
uint16_t delay);
void media_transport_update_volume(struct media_transport *transport,
- uint8_t volume);
+ int8_t volume);
void transport_get_properties(struct media_transport *transport,
DBusMessageIter *iter);
-uint8_t media_transport_get_device_volume(struct btd_device *dev);
+int8_t media_transport_get_device_volume(struct btd_device *dev);
void media_transport_update_device_volume(struct btd_device *dev,
- uint8_t volume);
+ int8_t volume);
#if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && defined(TIZEN_FEATURE_BLUEZ_A2DP_MULTISTREAM)
void media_transport_set_stream_status(struct btd_device *device, bool pause);