Lines Matching full:data
97 sbc_t sbc; /* Codec data */
139 struct bluetooth_a2dp a2dp; /* A2DP data */
167 struct bluetooth_data *data = param;
174 data->server.events = POLLIN;
175 /* note: only errors for data->stream.events */
177 fds[0] = data->server;
178 fds[1] = data->stream;
181 period_time = 1000000.0 * data->io.period_size / data->io.rate;
194 if (data->stopped)
197 if (data->reset) {
199 data->reset = 0;
215 data->hw_ptr += frags * data->io.period_size;
216 data->hw_ptr %= data->io.buffer_size;
221 if (write(data->pipefd[1], &c, 1) < 0)
254 data->hw_thread = 0;
260 struct bluetooth_data *data = io->private_data;
265 data->stopped = 0;
267 if (data->hw_thread)
270 err = pthread_create(&data->hw_thread, 0, playback_hw_thread, data);
277 struct bluetooth_data *data = io->private_data;
281 data->stopped = 1;
288 struct bluetooth_data *data = io->private_data;
290 return data->hw_ptr;
293 static void bluetooth_exit(struct bluetooth_data *data)
295 struct bluetooth_a2dp *a2dp = &data->a2dp;
297 if (data->server.fd >= 0)
298 bt_audio_service_close(data->server.fd);
300 if (data->stream.fd >= 0)
301 close(data->stream.fd);
303 if (data->hw_thread) {
304 pthread_cancel(data->hw_thread);
305 pthread_join(data->hw_thread, 0);
311 if (data->pipefd[0] > 0)
312 close(data->pipefd[0]);
314 if (data->pipefd[1] > 0)
315 close(data->pipefd[1]);
317 free(data);
322 struct bluetooth_data *data = io->private_data;
326 bluetooth_exit(data);
333 struct bluetooth_data *data = io->private_data;
346 data->reset = 0;
350 if (data->hw_thread) {
351 pthread_cancel(data->hw_thread);
352 pthread_join(data->hw_thread, 0);
353 data->hw_thread = 0;
359 data->hw_ptr = 0;
363 data->hw_ptr = io->period_size;
371 err = audioservice_send(data->server.fd, &req->h);
376 err = audioservice_expect(data->server.fd, &rsp->h,
382 err = audioservice_expect(data->server.fd, &ind->h,
387 if (data->stream.fd >= 0)
388 close(data->stream.fd);
390 data->stream.fd = bt_audio_service_get_data_fd(data->server.fd);
391 if (data->stream.fd < 0) {
395 if (data->transport == BT_CAPABILITIES_TRANSPORT_A2DP) {
399 if (setsockopt(data->stream.fd, SOL_SOCKET, opt_name, &t,
406 if (setsockopt(data->stream.fd, SOL_SCO, opt_name, &period_count,
413 if (setsockopt(data->stream.fd, SOL_SCO, opt_name, &period_count,
421 err = write(data->pipefd[1], &c, 1);
431 struct bluetooth_data *data = io->private_data;
447 strncpy(open_req->destination, data->alsa_config.device, 18);
452 err = audioservice_send(data->server.fd, &open_req->h);
457 err = audioservice_expect(data->server.fd, &open_rsp->h,
472 err = audioservice_send(data->server.fd, &req->h);
477 err = audioservice_expect(data->server.fd, &rsp->h,
482 data->transport = BT_CAPABILITIES_TRANSPORT_SCO;
483 data->link_mtu = rsp->link_mtu;
524 static int bluetooth_a2dp_init(struct bluetooth_data *data,
527 struct bluetooth_alsa_config *cfg = &data->alsa_config;
528 sbc_capabilities_t *cap = &data->a2dp.sbc_capabilities;
690 struct bluetooth_data *data = io->private_data;
691 struct bluetooth_a2dp *a2dp = &data->a2dp;
707 strncpy(open_req->destination, data->alsa_config.device, 18);
712 err = audioservice_send(data->server.fd, &open_req->h);
717 err = audioservice_expect(data->server.fd, &open_rsp->h,
722 err = bluetooth_a2dp_init(data, params);
738 err = audioservice_send(data->server.fd, &req->h);
743 err = audioservice_expect(data->server.fd, &rsp->h,
748 data->transport = BT_CAPABILITIES_TRANSPORT_A2DP;
749 data->link_mtu = rsp->link_mtu;
764 struct bluetooth_data *data = io->private_data;
771 pfd[0].fd = data->stream.fd;
797 struct bluetooth_data *data = io->private_data;
801 assert(data->pipefd[0] >= 0);
806 pfd[0].fd = data->pipefd[0];
809 pfd[1].fd = data->stream.fd;
848 struct bluetooth_data *data = io->private_data;
859 if (data->count > 0)
862 nrecv = recv(data->stream.fd, data->buffer, data->link_mtu,
870 if ((unsigned int) nrecv != data->link_mtu) {
877 data->hw_ptr = (data->hw_ptr + data->link_mtu / frame_size) %
884 if ((data->count + size * frame_size) <= data->link_mtu)
887 frames_to_write = (data->link_mtu - data->count) / frame_size;
889 memcpy(buff, data->buffer + data->count, frame_size * frames_to_write);
890 data->count += (frame_size * frames_to_write);
891 data->count %= data->link_mtu;
906 struct bluetooth_data *data = io->private_data;
923 if ((data->count + size * frame_size) <= data->link_mtu)
926 frames_to_read = (data->link_mtu - data->count) / frame_size;
928 DBG("count=%d frames_to_read=%lu", data->count, frames_to_read);
930 /* Ready for more data */
933 memcpy(data->buffer + data->count, buff, frame_size * frames_to_read);
936 data->count += frames_to_read * frame_size;
937 if (data->count != data->link_mtu) {
942 rsend = send(data->stream.fd, data->buffer, data->link_mtu,
946 data->count = 0;
967 static int avdtp_write(struct bluetooth_data *data)
972 struct bluetooth_a2dp *a2dp = &data->a2dp;
986 ret = send(data->stream.fd, a2dp->buffer, a2dp->count, MSG_DONTWAIT);
992 /* Reset buffer of data to send */
1005 struct bluetooth_data *data = io->private_data;
1006 struct bluetooth_a2dp *a2dp = &data->a2dp;
1029 data->reset = 1;
1052 /* Check if we have any left over data from the last write */
1053 if (data->count > 0 && (bytes_left - data->count) >= a2dp->codesize) {
1054 int additional_bytes_needed = a2dp->codesize - data->count;
1056 memcpy(data->buffer + data->count, buff,
1059 /* Enough data to encode (sbc wants 1k blocks) */
1060 encoded = sbc_encode(&a2dp->sbc, data->buffer, a2dp->codesize,
1076 if (a2dp->count + written >= data->link_mtu) {
1077 avdtp_write(data);
1080 data->link_mtu);
1084 * the data processed */
1088 /* Since data has been process mark it as zero */
1089 data->count = 0;
1095 /* Enough data to encode (sbc wants 1k blocks) */
1106 * the data processed */
1117 if (a2dp->count + written >= data->link_mtu) {
1118 avdtp_write(data);
1121 data->link_mtu);
1127 memcpy(data->buffer + data->count, buff, bytes_left);
1128 data->count += bytes_left;
1214 struct bluetooth_data *data = io->private_data;
1253 data->link_mtu, data->link_mtu);
1267 struct bluetooth_data *data = io->private_data;
1268 struct bluetooth_a2dp *a2dp = &data->a2dp;
1269 struct bluetooth_alsa_config *cfg = &data->alsa_config;
1542 SNDERR("Error sending data to audio service: %s(%d)",
1563 SNDERR("Error receiving IPC data from bluetoothd: %s (%d)",
1614 static int bluetooth_parse_capabilities(struct bluetooth_data *data,
1618 codec_capabilities_t *codec = (void *) rsp->data;
1620 data->transport = codec->transport;
1635 codec->length != sizeof(data->a2dp.sbc_capabilities))
1638 memcpy(&data->a2dp.sbc_capabilities, codec, codec->length);
1643 static int bluetooth_init(struct bluetooth_data *data,
1647 struct bluetooth_alsa_config *alsa_conf = &data->alsa_config;
1652 memset(data, 0, sizeof(struct bluetooth_data));
1658 data->server.fd = -1;
1659 data->stream.fd = -1;
1667 data->server.fd = sk;
1668 data->server.events = POLLIN;
1670 data->pipefd[0] = -1;
1671 data->pipefd[1] = -1;
1673 if (pipe(data->pipefd) < 0) {
1677 if (fcntl(data->pipefd[0], F_SETFL, O_NONBLOCK) < 0) {
1681 if (fcntl(data->pipefd[1], F_SETFL, O_NONBLOCK) < 0) {
1699 err = audioservice_send(data->server.fd, &req->h);
1704 err = audioservice_expect(data->server.fd, &rsp->h,
1709 bluetooth_parse_capabilities(data, rsp);
1723 struct bluetooth_data *data;
1729 data = malloc(sizeof(struct bluetooth_data));
1730 if (!data) {
1735 err = bluetooth_init(data, stream, conf);
1739 data->io.version = SND_PCM_IOPLUG_VERSION;
1740 data->io.name = "Bluetooth Audio Device";
1741 data->io.mmap_rw = 0; /* No direct mmap communication */
1742 data->io.private_data = data;
1744 if (data->transport == BT_CAPABILITIES_TRANSPORT_A2DP)
1745 data->io.callback = stream == SND_PCM_STREAM_PLAYBACK ?
1749 data->io.callback = stream == SND_PCM_STREAM_PLAYBACK ?
1753 err = snd_pcm_ioplug_create(&data->io, name, stream, mode);
1757 if (data->transport == BT_CAPABILITIES_TRANSPORT_A2DP)
1758 err = bluetooth_a2dp_hw_constraint(&data->io);
1760 err = bluetooth_hsp_hw_constraint(&data->io);
1763 snd_pcm_ioplug_delete(&data->io);
1767 *pcmp = data->io.pcm;
1772 if (data)
1773 bluetooth_exit(data);