diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 5fd2091..f3ac1a2 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
void (*set_state)(struct media_transport *transport,
transport_state_t state);
void *(*get_stream)(struct media_transport *transport);
- uint8_t (*get_volume)(struct media_transport *transport);
- int (*set_volume)(struct media_transport *transport, uint8_t level);
+ int (*get_volume)(struct media_transport *transport);
+ int (*set_volume)(struct media_transport *transport, int level);
int (*set_delay)(struct media_transport *transport, uint16_t delay);
void (*update_links)(const struct media_transport *transport);
GDestroyNotify destroy;
a2dp->cancel_resume = FALSE;
}
-static uint8_t transport_a2dp_get_volume(struct media_transport *transport)
+static int transport_a2dp_get_volume(struct media_transport *transport)
{
struct a2dp_transport *a2dp = transport->data;
return a2dp->volume;
#ifdef HAVE_AVRCP
static int transport_a2dp_src_set_volume(struct media_transport *transport,
- uint8_t level)
+ int level)
{
struct a2dp_transport *a2dp = transport->data;
+ if (level < 0 || level > 127)
+ return -EINVAL;
+
if (a2dp->volume == level)
return 0;
}
static int transport_a2dp_snk_set_volume(struct media_transport *transport,
- uint8_t level)
+ int level)
{
struct a2dp_transport *a2dp = transport->data;
bool notify;
+ if (level < 0 || level > 127)
+ return -EINVAL;
+
if (a2dp->volume == level)
return 0;
static gboolean volume_exists(const GDBusPropertyTable *property, void *data)
{
struct media_transport *transport = data;
- int8_t volume;
+ int volume;
if (media_transport_get_volume(transport, &volume))
return FALSE;
return volume >= 0;
}
-int media_transport_get_volume(struct media_transport *transport,
- int8_t *volume)
+int media_transport_get_volume(struct media_transport *transport, int *volume)
{
if (transport->ops && transport->ops->get_volume) {
*volume = transport->ops->get_volume(transport);
DBusMessageIter *iter, void *data)
{
struct media_transport *transport = data;
- int8_t level;
+ int level;
uint16_t volume;
if (media_transport_get_volume(transport, &level))
}
static int media_transport_set_volume(struct media_transport *transport,
- int8_t level)
+ int level)
{
DBG("Transport %s level %d", transport->path, level);
}
dbus_message_iter_get_basic(iter, &arg);
- if (arg > INT8_MAX) {
+ err = media_transport_set_volume(transport, arg);
+ if (err == -EINVAL) {
g_dbus_pending_property_error(id,
ERROR_INTERFACE ".InvalidArguments",
- "Volume must not be larger than 127");
+ "Invalid volume value");
return;
- }
-
- err = media_transport_set_volume(transport, arg);
- if (err) {
+ } else if (err) {
error("Unable to set volume: %s (%d)", strerror(-err), err);
g_dbus_pending_property_error(id,
ERROR_INTERFACE ".Failed",
bap_update_links(transport);
}
-static uint8_t transport_bap_get_volume(struct media_transport *transport)
+static int transport_bap_get_volume(struct media_transport *transport)
{
return bt_audio_vcp_get_volume(transport->device);
}
static int transport_bap_set_volume(struct media_transport *transport,
- uint8_t volume)
+ int volume)
{
+ if (volume < 0 || volume > 255)
+ return -EINVAL;
+
return bt_audio_vcp_set_volume(transport->device, volume) ? 0 : -EIO;
}
}
}
-static uint8_t transport_asha_get_volume(struct media_transport *transport)
+static int transport_asha_get_volume(struct media_transport *transport)
{
struct bt_asha_device *asha_dev = transport->data;
int8_t volume;
}
static int transport_asha_set_volume(struct media_transport *transport,
- uint8_t volume)
+ int volume)
{
struct bt_asha_device *asha_dev = transport->data;
int scaled_volume;
+ if (volume < 0 || volume > 127)
+ return -EINVAL;
+
/* Convert 0-127 to -128-0 */
scaled_volume = ((((int) volume) * 128) / 127) - 128;
}
void media_transport_update_volume(struct media_transport *transport,
- int8_t volume)
+ int volume)
{
if (volume < 0)
return;
if (media_endpoint_get_sep(transport->endpoint)) {
struct a2dp_transport *a2dp = transport->data;
+ if (volume > 127)
+ return;
+
/* Check if volume really changed */
if (a2dp->volume == volume)
return;
MEDIA_TRANSPORT_INTERFACE, "Volume");
}
-int8_t media_transport_get_device_volume(struct btd_device *dev)
+int media_transport_get_device_volume(struct btd_device *dev)
{
GSList *l;
/* Volume is A2DP only */
if (media_endpoint_get_sep(transport->endpoint)) {
- int8_t volume;
+ int volume;
if (!media_transport_get_volume(transport, &volume))
return volume;
}
void media_transport_update_device_volume(struct btd_device *dev,
- int8_t volume)
+ int volume)
{
GSList *l;
diff --git a/profiles/audio/transport.h b/profiles/audio/transport.h
index b46bc80..808e1a1 100644
--- a/profiles/audio/transport.h
+++ b/profiles/audio/transport.h
void *media_transport_get_stream(struct media_transport *transport);
struct btd_device *media_transport_get_dev(struct media_transport *transport);
int media_transport_get_volume(struct media_transport *transport,
- int8_t *volume);
+ int *volume);
void media_transport_update_delay(struct media_transport *transport,
uint16_t delay);
void media_transport_update_volume(struct media_transport *transport,
- int8_t volume);
+ int volume);
void transport_get_properties(struct media_transport *transport,
DBusMessageIter *iter);
-int8_t media_transport_get_device_volume(struct btd_device *dev);
+int media_transport_get_device_volume(struct btd_device *dev);
void media_transport_update_device_volume(struct btd_device *dev,
- int8_t volume);
+ int volume);