diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-08-31 11:51:43 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-08-31 11:51:43 +0000 |
commit | ec384afacde8614306abe32cf40c55b795783f0e (patch) | |
tree | 64becc3deee3b735acddd15157fa428ccfbf2b22 /audio/pcm_bluetooth.c | |
parent | fc0d501d82773718d0f2d040f786136332c39813 (diff) |
Implement proper locking for headsets
Diffstat (limited to 'audio/pcm_bluetooth.c')
-rw-r--r-- | audio/pcm_bluetooth.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/audio/pcm_bluetooth.c b/audio/pcm_bluetooth.c index b99f4ccd..5a3b2317 100644 --- a/audio/pcm_bluetooth.c +++ b/audio/pcm_bluetooth.c @@ -893,7 +893,8 @@ static int bluetooth_a2dp_init(struct bluetooth_data *data, return 0; } -static int bluetooth_cfg_init(struct ipc_packet *pkt, snd_config_t *conf) +static int bluetooth_cfg_init(struct ipc_packet *pkt, snd_pcm_stream_t stream, + snd_config_t *conf) { struct ipc_data_cfg *cfg = (void *) pkt->data; struct ipc_codec_sbc *sbc = (void *) cfg->data; @@ -901,6 +902,15 @@ static int bluetooth_cfg_init(struct ipc_packet *pkt, snd_config_t *conf) const char *addr, *pref; const char *mode, *allocation, *rate, *subbands, *blocks, *bitpool; + switch (stream) { + case SND_PCM_STREAM_PLAYBACK: + cfg->fd_opt = CFG_FD_OPT_WRITE; + break; + case SND_PCM_STREAM_CAPTURE: + cfg->fd_opt = CFG_FD_OPT_READ; + break; + } + snd_config_for_each(i, next, conf) { snd_config_t *n = snd_config_iterator_entry(i); const char *id; @@ -1023,7 +1033,8 @@ static int bluetooth_cfg_init(struct ipc_packet *pkt, snd_config_t *conf) return 0; } -static int bluetooth_cfg(struct bluetooth_data *data, snd_config_t *conf) +static int bluetooth_cfg(struct bluetooth_data *data, snd_pcm_stream_t stream, + snd_config_t *conf) { int ret, total; char buf[IPC_MTU]; @@ -1035,7 +1046,7 @@ static int bluetooth_cfg(struct bluetooth_data *data, snd_config_t *conf) memset(buf, 0, sizeof(buf)); - ret = bluetooth_cfg_init(pkt, conf); + ret = bluetooth_cfg_init(pkt, stream, conf); if (ret < 0) return -ret; @@ -1119,7 +1130,8 @@ done: return 0; } -static int bluetooth_init(struct bluetooth_data *data, snd_config_t *conf) +static int bluetooth_init(struct bluetooth_data *data, snd_pcm_stream_t stream, + snd_config_t *conf) { int sk, err; struct sockaddr_un addr = { @@ -1160,7 +1172,7 @@ static int bluetooth_init(struct bluetooth_data *data, snd_config_t *conf) if (fcntl(data->pipefd[1], F_SETFL, O_NONBLOCK) < 0) return -errno; - return bluetooth_cfg(data, conf); + return bluetooth_cfg(data, stream, conf); } SND_PCM_PLUGIN_DEFINE_FUNC(bluetooth) @@ -1177,7 +1189,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(bluetooth) goto error; } - err = bluetooth_init(data, conf); + err = bluetooth_init(data, stream, conf); if (err < 0) goto error; |