[pulseaudio-discuss] [PATCH 1/3] backend-native: add support for the HSP Headset role
Tanu Kaskinen
tanuk at iki.fi
Mon Mar 6 22:16:12 UTC 2017
On Thu, 2017-03-02 at 17:04 +0100, Georg Chini wrote:
> #define HSP_AG_PROFILE "/Profile/HSPAGProfile"
> +#define HSP_HS_PROFILE "/Profile/HSPHSProfile"
> +
> +/* RFCOMM channel for HSP headset role */
> +#define HSP_HS_DEFAULT_CHANNEL 3
The comment still doesn't explain why 3 is a good default.
I realize you might not know, since this was originally written by Wim.
I added Wim to Cc -- Wim, can you explain why 3 is the best channel? It
looks like a deliberate choice.
> @@ -249,22 +373,38 @@ static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_i
> buf[len] = 0;
> pa_log_debug("RFCOMM << %s", buf);
>
> - if (sscanf(buf, "AT+VGS=%d", &gain) == 1) {
> - t->speaker_gain = gain;
> - pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED), t);
> - } else if (sscanf(buf, "AT+VGM=%d", &gain) == 1) {
> - t->microphone_gain = gain;
> - pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED), t);
> + /* There are only four HSP AT commands:
> + * AT+VGS=value: value between 0 and 15, sets the speaker gain in AG role or notifies the
> + * AG that the speaker gain has changed in HS role.
> + * AT+VGM=value: value between 0 and 15, sets the microphone gain in AG role or notifies
> + * the AG that the microphone gain has changed.
I think +VGS/+VGM should be explained separately from AT+VGS/AT+VGM.
> @@ -295,17 +440,25 @@ static void set_speaker_gain(pa_bluetooth_transport *t, uint16_t gain) {
>
> t->speaker_gain = gain;
>
> - len = sprintf(buf, "\r\n+VGS=%d\r\n", gain);
> - pa_log_debug("RFCOMM >> +VGS=%d", gain);
> + /* If we are in the AG role, we send a command to the head set to change
> + * the speaker gain. In the HS role, source and sink are swapped, so
> + * in this case we notify the AG that the microphone gain has changed */
> + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) {
> + len = sprintf(buf, "\r\n+VGS=%d\r\n", gain);
> + pa_log_debug("RFCOMM >> +VGS=%d", gain);
> + } else {
> + len = sprintf(buf, "\r\n+VGM=%d\r\n", gain);
> + pa_log_debug("RFCOMM >> +VGM=%d", gain);
AT+VGM should be used here.
> @@ -314,10 +467,18 @@ static void set_microphone_gain(pa_bluetooth_transport *t, uint16_t gain) {
>
> t->microphone_gain = gain;
>
> - len = sprintf(buf, "\r\n+VGM=%d\r\n", gain);
> - pa_log_debug("RFCOMM >> +VGM=%d", gain);
> + /* If we are in the AG role, we send a command to the head set to change
> + * the microphone gain. In the HS role, source and sink are swapped, so
> + * in this case we notify the AG that the speaker gain has changed */
> + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) {
> + len = sprintf(buf, "\r\n+VGM=%d\r\n", gain);
> + pa_log_debug("RFCOMM >> +VGM=%d", gain);
> + } else {
> + len = sprintf(buf, "\r\n+VGS=%d\r\n", gain);
> + pa_log_debug("RFCOMM >> +VGS=%d", gain);
AT+VGS should be used here.
--
Tanu
https://www.patreon.com/tanuk
More information about the pulseaudio-discuss
mailing list