Lines Matching +full:cfg +full:-
1 /*-
2 * Copyright (c) 2015-2019 Hans Petter Selasky
60 bt_receive(struct bt_config *cfg, void *ptr, int len, int use_delay) in bt_receive() argument
62 struct sbc_header *phdr = (struct sbc_header *)cfg->mtu_data; in bt_receive()
63 struct sbc_encode *sbc = cfg->handle.sbc_enc; in bt_receive()
73 switch (cfg->blocks) { in bt_receive()
75 sbc->blocks = 4; in bt_receive()
78 sbc->blocks = 8; in bt_receive()
81 sbc->blocks = 12; in bt_receive()
84 sbc->blocks = 16; in bt_receive()
88 switch (cfg->bands) { in bt_receive()
90 sbc->bands = 4; in bt_receive()
93 sbc->bands = 8; in bt_receive()
97 if (cfg->chmode != MODE_MONO) { in bt_receive()
98 sbc->channels = 2; in bt_receive()
100 sbc->channels = 1; in bt_receive()
105 if (delta > (int)(2 * sbc->rem_len)) in bt_receive()
106 delta = (2 * sbc->rem_len); in bt_receive()
109 memcpy(tmp, (char *)sbc->music_data + sbc->rem_off, delta); in bt_receive()
111 len -= delta; in bt_receive()
112 sbc->rem_off += delta / 2; in bt_receive()
113 sbc->rem_len -= delta / 2; in bt_receive()
117 if (sbc->rem_len == 0 && in bt_receive()
118 sbc->rem_data_frames != 0) { in bt_receive()
119 err = sbc_decode_frame(cfg, sbc->rem_data_len * 8); in bt_receive()
120 sbc->rem_data_frames--; in bt_receive()
121 sbc->rem_data_ptr += err; in bt_receive()
122 sbc->rem_data_len -= err; in bt_receive()
126 err = read(cfg->fd, cfg->mtu_data, cfg->mtu); in bt_receive()
134 return (-1); /* disconnected */ in bt_receive()
138 if (err < (int)sizeof(*phdr) || phdr->id != 0x80) in bt_receive()
141 sbc->rem_data_frames = phdr->numFrames; in bt_receive()
142 sbc->rem_data_ptr = (uint8_t *)(phdr + 1); in bt_receive()
143 sbc->rem_data_len = err - sizeof(*phdr); in bt_receive()
145 return (old_len - len); in bt_receive()
158 return (-1); in bt_set_format()
164 struct bt_config *cfg = pbe->arg; in bt_close() local
166 if (cfg->hc > 0) { in bt_close()
167 avdtpAbort(cfg->hc, cfg->sep); in bt_close()
168 avdtpClose(cfg->hc, cfg->sep); in bt_close()
169 close(cfg->hc); in bt_close()
170 cfg->hc = -1; in bt_close()
172 if (cfg->fd > 0) { in bt_close()
173 close(cfg->fd); in bt_close()
174 cfg->fd = -1; in bt_close()
181 struct bt_config *cfg = pbe->arg; in bt_play_close() local
183 switch (cfg->codec) { in bt_play_close()
185 if (cfg->handle.sbc_enc == NULL) in bt_play_close()
187 free(cfg->handle.sbc_enc); in bt_play_close()
188 cfg->handle.sbc_enc = NULL; in bt_play_close()
192 if (cfg->handle.av.context == NULL) in bt_play_close()
194 av_free(cfg->rem_in_data); in bt_play_close()
195 av_frame_free(&cfg->handle.av.frame); in bt_play_close()
196 avcodec_close(cfg->handle.av.context); in bt_play_close()
197 avformat_free_context(cfg->handle.av.format); in bt_play_close()
198 cfg->handle.av.context = NULL; in bt_play_close()
210 struct bt_config *cfg = pbe->arg; in bt_rec_close() local
212 switch (cfg->codec) { in bt_rec_close()
240 int psm = -1; in bt_find_psm()
242 if ((end - start) < 2) in bt_find_psm()
243 return (-1); in bt_find_psm()
260 return (-1); in bt_find_psm()
279 return (-1); in bt_find_psm()
282 if (len > (uint32_t)(end - start)) in bt_find_psm()
309 if (protover >= 0x0100 && psm > -1) in bt_find_psm()
312 return (-1); in bt_find_psm()
321 int psm = -1; in bt_query()
327 ss = sdp_open(&info->laddr, &info->raddr); in bt_query()
353 if (psm > -1) in bt_query()
363 int bufsize __unused, int *pchannels, int *pformat, struct bt_config *cfg, in bt_open() argument
380 devname += sizeof("/dev/bluetooth/") - 1; in bt_open()
389 bdaddr_copy(&info.raddr, (bdaddr_t *)he->h_addr); in bt_open()
393 cfg->freq = FREQ_UNDEFINED; in bt_open()
394 cfg->aacMode1 = 0x80; in bt_open()
395 cfg->aacMode2 = 0x0C; in bt_open()
398 cfg->freq = FREQ_UNDEFINED; in bt_open()
399 cfg->aacMode1 = 0x40; in bt_open()
400 cfg->aacMode2 = 0x0C; in bt_open()
403 cfg->freq = FREQ_UNDEFINED; in bt_open()
404 cfg->aacMode1 = 0x20; in bt_open()
405 cfg->aacMode2 = 0x0C; in bt_open()
408 cfg->freq = FREQ_16K; in bt_open()
409 cfg->aacMode1 = 0x10; in bt_open()
410 cfg->aacMode2 = 0x0C; in bt_open()
413 cfg->freq = FREQ_UNDEFINED; in bt_open()
414 cfg->aacMode1 = 0x08; in bt_open()
415 cfg->aacMode2 = 0x0C; in bt_open()
418 cfg->freq = FREQ_UNDEFINED; in bt_open()
419 cfg->aacMode1 = 0x04; in bt_open()
420 cfg->aacMode2 = 0x0C; in bt_open()
423 cfg->freq = FREQ_32K; in bt_open()
424 cfg->aacMode1 = 0x02; in bt_open()
425 cfg->aacMode2 = 0x0C; in bt_open()
428 cfg->freq = FREQ_44_1K; in bt_open()
429 cfg->aacMode1 = 0x01; in bt_open()
430 cfg->aacMode2 = 0x0C; in bt_open()
433 cfg->freq = FREQ_48K; in bt_open()
434 cfg->aacMode1 = 0; in bt_open()
435 cfg->aacMode2 = 0x8C; in bt_open()
438 cfg->freq = FREQ_UNDEFINED; in bt_open()
439 cfg->aacMode1 = 0; in bt_open()
440 cfg->aacMode2 = 0x4C; in bt_open()
443 cfg->freq = FREQ_UNDEFINED; in bt_open()
444 cfg->aacMode1 = 0; in bt_open()
445 cfg->aacMode2 = 0x2C; in bt_open()
448 cfg->freq = FREQ_UNDEFINED; in bt_open()
449 cfg->aacMode1 = 0; in bt_open()
450 cfg->aacMode2 = 0x1C; in bt_open()
456 cfg->bands = BANDS_8; in bt_open()
457 cfg->bitpool = 0; in bt_open()
461 cfg->aacMode2 &= 0xF8; in bt_open()
462 cfg->chmode = MODE_MONO; in bt_open()
465 cfg->aacMode2 &= 0xF4; in bt_open()
466 cfg->chmode = MODE_STEREO; in bt_open()
470 cfg->allocm = ALLOC_LOUDNESS; in bt_open()
472 if (cfg->chmode == MODE_MONO || cfg->chmode == MODE_DUAL) in bt_open()
477 if (cfg->bands == BANDS_8) in bt_open()
485 cfg->bitpool = tmpbitpool; in bt_open()
497 cfg->hc = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BLUETOOTH_PROTO_L2CAP); in bt_open()
498 if (cfg->hc < 0) { in bt_open()
507 if (bind(cfg->hc, (struct sockaddr *)&addr, sizeof(addr)) < 0) { in bt_open()
513 if (connect(cfg->hc, (struct sockaddr *)&addr, sizeof(addr)) < 0) { in bt_open()
517 if (avdtpDiscoverAndConfig(cfg, isSink)) { in bt_open()
521 if (avdtpOpen(cfg->hc, cfg->sep)) { in bt_open()
525 cfg->fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BLUETOOTH_PROTO_L2CAP); in bt_open()
526 if (cfg->fd < 0) { in bt_open()
536 if (bind(cfg->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { in bt_open()
542 if (connect(cfg->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { in bt_open()
547 if (getsockopt(cfg->fd, SOL_L2CAP, SO_L2CAP_OMTU, &cfg->mtu, &mtusize) == -1) { in bt_open()
551 temp = cfg->mtu * 16; in bt_open()
552 if (setsockopt(cfg->fd, SOL_SOCKET, SO_SNDBUF, &temp, sizeof(temp)) == -1) { in bt_open()
556 temp = cfg->mtu; in bt_open()
557 if (setsockopt(cfg->fd, SOL_SOCKET, SO_SNDLOWAT, &temp, sizeof(temp)) == -1) { in bt_open()
562 if (getsockopt(cfg->fd, SOL_L2CAP, SO_L2CAP_IMTU, &cfg->mtu, &mtusize) == -1) { in bt_open()
566 temp = cfg->mtu * 16; in bt_open()
567 if (setsockopt(cfg->fd, SOL_SOCKET, SO_RCVBUF, &temp, sizeof(temp)) == -1) { in bt_open()
572 if (setsockopt(cfg->fd, SOL_SOCKET, SO_RCVLOWAT, &temp, sizeof(temp)) == -1) { in bt_open()
577 if (ioctl(cfg->fd, FIONBIO, &temp) == -1) { in bt_open()
578 DPRINTF("Could not set non-blocking I/O for receive direction\n"); in bt_open()
583 if (avdtpStart(cfg->hc, cfg->sep)) { in bt_open()
587 switch (cfg->chmode) { in bt_open()
598 if (cfg->hc > 0) { in bt_open()
599 close(cfg->hc); in bt_open()
600 cfg->hc = -1; in bt_open()
602 if (cfg->fd > 0) { in bt_open()
603 close(cfg->fd); in bt_open()
604 cfg->fd = -1; in bt_open()
606 return (-1); in bt_open()
610 bt_init_cfg(struct bt_config *cfg) in bt_init_cfg() argument
612 memset(cfg, 0, sizeof(*cfg)); in bt_init_cfg()
619 struct bt_config *cfg = pbe->arg; in bt_rec_open() local
622 bt_init_cfg(cfg); in bt_rec_open()
625 cfg, SDP_SERVICE_CLASS_AUDIO_SOURCE, 0); in bt_rec_open()
635 struct bt_config *cfg = pbe->arg; in bt_play_open() local
638 bt_init_cfg(cfg); in bt_play_open()
641 cfg, SDP_SERVICE_CLASS_AUDIO_SINK, 1); in bt_play_open()
646 switch (cfg->codec) { in bt_play_open()
648 cfg->handle.sbc_enc = in bt_play_open()
649 malloc(sizeof(*cfg->handle.sbc_enc)); in bt_play_open()
650 if (cfg->handle.sbc_enc == NULL) in bt_play_open()
651 return (-1); in bt_play_open()
652 memset(cfg->handle.sbc_enc, 0, sizeof(*cfg->handle.sbc_enc)); in bt_play_open()
656 cfg->handle.av.codec = __DECONST(AVCodec *, in bt_play_open()
658 if (cfg->handle.av.codec == NULL) { in bt_play_open()
662 cfg->handle.av.format = avformat_alloc_context(); in bt_play_open()
663 if (cfg->handle.av.format == NULL) { in bt_play_open()
667 cfg->handle.av.format->oformat = in bt_play_open()
669 if (cfg->handle.av.format->oformat == NULL) { in bt_play_open()
673 cfg->handle.av.stream = avformat_new_stream( in bt_play_open()
674 cfg->handle.av.format, cfg->handle.av.codec); in bt_play_open()
676 if (cfg->handle.av.stream == NULL) { in bt_play_open()
680 cfg->handle.av.context = avcodec_alloc_context3(cfg->handle.av.codec); in bt_play_open()
681 if (cfg->handle.av.context == NULL) { in bt_play_open()
685 /*avcodec_get_context_defaults3(cfg->handle.av.context,*/ in bt_play_open()
686 /*cfg->handle.av.codec);*/ in bt_play_open()
688 cfg->handle.av.context->bit_rate = 128000; in bt_play_open()
689 cfg->handle.av.context->sample_fmt = AV_SAMPLE_FMT_FLTP; in bt_play_open()
690 cfg->handle.av.context->sample_rate = samplerate; in bt_play_open()
693 cfg->handle.av.context->ch_layout = *(AVChannelLayout *)AV_CH_LAYOUT_MONO; in bt_play_open()
696 cfg->handle.av.context->ch_layout = *(AVChannelLayout *)AV_CH_LAYOUT_STEREO; in bt_play_open()
700 cfg->handle.av.context->profile = FF_PROFILE_AAC_LOW; in bt_play_open()
704 av_dict_set(&opts, "strict", "-2", 0); in bt_play_open()
707 if (avcodec_open2(cfg->handle.av.context, in bt_play_open()
708 cfg->handle.av.codec, &opts) < 0) { in bt_play_open()
716 cfg->handle.av.frame = av_frame_alloc(); in bt_play_open()
717 if (cfg->handle.av.frame == NULL) { in bt_play_open()
721 cfg->handle.av.frame->nb_samples = cfg->handle.av.context->frame_size; in bt_play_open()
722 cfg->handle.av.frame->format = cfg->handle.av.context->sample_fmt; in bt_play_open()
723 cfg->handle.av.frame->ch_layout = cfg->handle.av.context->ch_layout; in bt_play_open()
724 cfg->rem_in_size = av_samples_get_buffer_size(NULL, in bt_play_open()
725 cfg->handle.av.context->ch_layout.nb_channels, in bt_play_open()
726 cfg->handle.av.context->frame_size, in bt_play_open()
727 cfg->handle.av.context->sample_fmt, 0); in bt_play_open()
729 cfg->rem_in_data = av_malloc(cfg->rem_in_size); in bt_play_open()
730 if (cfg->rem_in_data == NULL) { in bt_play_open()
732 (unsigned)cfg->rem_in_size); in bt_play_open()
735 retval = avcodec_fill_audio_frame(cfg->handle.av.frame, in bt_play_open()
736 cfg->handle.av.context->ch_layout.nb_channels, in bt_play_open()
737 cfg->handle.av.context->sample_fmt, in bt_play_open()
738 cfg->rem_in_data, cfg->rem_in_size, 0); in bt_play_open()
745 av_free(cfg->rem_in_data); in bt_play_open()
747 av_frame_free(&cfg->handle.av.frame); in bt_play_open()
749 avcodec_close(cfg->handle.av.context); in bt_play_open()
751 avformat_free_context(cfg->handle.av.format); in bt_play_open()
752 cfg->handle.av.context = NULL; in bt_play_open()
755 return (-1); in bt_play_open()
759 return (-1); in bt_play_open()
767 return (bt_receive(pbe->arg, ptr, len, 1)); in bt_rec_transfer()
773 struct bt_config *cfg = pbe->arg; in bt_play_sbc_transfer() local
774 struct sbc_encode *sbc = cfg->handle.sbc_enc; in bt_play_sbc_transfer()
779 switch (cfg->blocks) { in bt_play_sbc_transfer()
781 sbc->blocks = 4; in bt_play_sbc_transfer()
785 sbc->blocks = 8; in bt_play_sbc_transfer()
789 sbc->blocks = 12; in bt_play_sbc_transfer()
793 sbc->blocks = 16; in bt_play_sbc_transfer()
798 switch (cfg->bands) { in bt_play_sbc_transfer()
801 sbc->bands = 4; in bt_play_sbc_transfer()
805 sbc->bands = 8; in bt_play_sbc_transfer()
810 sbc->framesamples = rem_size; in bt_play_sbc_transfer()
812 if (cfg->chmode != MODE_MONO) { in bt_play_sbc_transfer()
814 sbc->channels = 2; in bt_play_sbc_transfer()
816 sbc->channels = 1; in bt_play_sbc_transfer()
819 rem_size *= 2; /* 16-bit samples */ in bt_play_sbc_transfer()
824 if (delta > (int)(rem_size - sbc->rem_len)) in bt_play_sbc_transfer()
825 delta = (int)(rem_size - sbc->rem_len); in bt_play_sbc_transfer()
828 memcpy((char *)sbc->music_data + sbc->rem_len, ptr, delta); in bt_play_sbc_transfer()
831 len -= delta; in bt_play_sbc_transfer()
832 sbc->rem_len += delta; in bt_play_sbc_transfer()
835 if ((int)sbc->rem_len == rem_size) { in bt_play_sbc_transfer()
836 struct sbc_header *phdr = (struct sbc_header *)cfg->mtu_data; in bt_play_sbc_transfer()
840 if (cfg->chmode == MODE_MONO) in bt_play_sbc_transfer()
841 sbc->channels = 1; in bt_play_sbc_transfer()
843 sbc->channels = 2; in bt_play_sbc_transfer()
845 pkt_len = sbc_encode_frame(cfg); in bt_play_sbc_transfer()
848 if (cfg->mtu_offset == 0) { in bt_play_sbc_transfer()
849 phdr->id = 0x80; /* RTP v2 */ in bt_play_sbc_transfer()
850 phdr->id2 = 0x60; /* payload type 96. */ in bt_play_sbc_transfer()
851 phdr->seqnumMSB = (uint8_t)(cfg->mtu_seqnumber >> 8); in bt_play_sbc_transfer()
852 phdr->seqnumLSB = (uint8_t)(cfg->mtu_seqnumber); in bt_play_sbc_transfer()
853 phdr->ts3 = (uint8_t)(cfg->mtu_timestamp >> 24); in bt_play_sbc_transfer()
854 phdr->ts2 = (uint8_t)(cfg->mtu_timestamp >> 16); in bt_play_sbc_transfer()
855 phdr->ts1 = (uint8_t)(cfg->mtu_timestamp >> 8); in bt_play_sbc_transfer()
856 phdr->ts0 = (uint8_t)(cfg->mtu_timestamp); in bt_play_sbc_transfer()
857 phdr->reserved0 = 0x01; in bt_play_sbc_transfer()
858 phdr->numFrames = 0; in bt_play_sbc_transfer()
860 cfg->mtu_seqnumber++; in bt_play_sbc_transfer()
861 cfg->mtu_offset += sizeof(*phdr); in bt_play_sbc_transfer()
864 rem = cfg->mtu - cfg->mtu_offset; in bt_play_sbc_transfer()
866 if (phdr->numFrames == 255 || rem < pkt_len) { in bt_play_sbc_transfer()
869 if (phdr->numFrames == 0) in bt_play_sbc_transfer()
870 return (-1); in bt_play_sbc_transfer()
872 xlen = write(cfg->fd, cfg->mtu_data, cfg->mtu_offset); in bt_play_sbc_transfer()
876 return (-1); in bt_play_sbc_transfer()
878 cfg->mtu_offset = 0; in bt_play_sbc_transfer()
881 memcpy(cfg->mtu_data + cfg->mtu_offset, sbc->data, pkt_len); in bt_play_sbc_transfer()
882 memset(sbc->data, 0, pkt_len); in bt_play_sbc_transfer()
883 cfg->mtu_offset += pkt_len; in bt_play_sbc_transfer()
884 cfg->mtu_timestamp += sbc->framesamples; in bt_play_sbc_transfer()
885 phdr->numFrames++; in bt_play_sbc_transfer()
887 sbc->rem_len = 0; in bt_play_sbc_transfer()
899 struct bt_config *cfg = pbe->arg; in bt_play_aac_transfer() local
922 if (delta > (int)(cfg->rem_in_size - cfg->rem_in_len)) in bt_play_aac_transfer()
923 delta = (int)(cfg->rem_in_size - cfg->rem_in_len); in bt_play_aac_transfer()
925 memcpy(cfg->rem_in_data + cfg->rem_in_len, ptr, delta); in bt_play_aac_transfer()
928 len -= delta; in bt_play_aac_transfer()
929 cfg->rem_in_len += delta; in bt_play_aac_transfer()
932 if (cfg->rem_in_len == cfg->rem_in_size) { in bt_play_aac_transfer()
933 struct aac_header *phdr = (struct aac_header *)cfg->mtu_data; in bt_play_aac_transfer()
939 err = avcodec_send_frame(cfg->handle.av.context, in bt_play_aac_transfer()
940 cfg->handle.av.frame); in bt_play_aac_transfer()
943 return (-1); in bt_play_aac_transfer()
945 phdr->id = 0x80;/* RTP v2 */ in bt_play_aac_transfer()
946 phdr->id2 = 0x60; /* payload type 96. */ in bt_play_aac_transfer()
947 phdr->seqnumMSB = (uint8_t)(cfg->mtu_seqnumber >> 8); in bt_play_aac_transfer()
948 phdr->seqnumLSB = (uint8_t)(cfg->mtu_seqnumber); in bt_play_aac_transfer()
949 phdr->ts3 = (uint8_t)(cfg->mtu_timestamp >> 24); in bt_play_aac_transfer()
950 phdr->ts2 = (uint8_t)(cfg->mtu_timestamp >> 16); in bt_play_aac_transfer()
951 phdr->ts1 = (uint8_t)(cfg->mtu_timestamp >> 8); in bt_play_aac_transfer()
952 phdr->ts0 = (uint8_t)(cfg->mtu_timestamp); in bt_play_aac_transfer()
953 phdr->sync3 = 0; in bt_play_aac_transfer()
954 phdr->sync2 = 0; in bt_play_aac_transfer()
955 phdr->sync1 = 0; in bt_play_aac_transfer()
956 phdr->sync0 = 0; in bt_play_aac_transfer()
957 phdr->fixed[0] = 0xfc; in bt_play_aac_transfer()
958 phdr->fixed[1] = 0x00; in bt_play_aac_transfer()
959 phdr->fixed[2] = 0x00; in bt_play_aac_transfer()
960 phdr->fixed[3] = 0xb0; in bt_play_aac_transfer()
961 phdr->fixed[4] = 0x90; in bt_play_aac_transfer()
962 phdr->fixed[5] = 0x80; in bt_play_aac_transfer()
963 phdr->fixed[6] = 0x03; in bt_play_aac_transfer()
964 phdr->fixed[7] = 0x00; in bt_play_aac_transfer()
966 cfg->mtu_seqnumber++; in bt_play_aac_transfer()
967 cfg->mtu_offset = sizeof(*phdr); in bt_play_aac_transfer()
970 rem = cfg->mtu - cfg->mtu_offset; in bt_play_aac_transfer()
972 if (avio_open_dyn_buf(&cfg->handle.av.format->pb) == 0) { in bt_play_aac_transfer()
976 (void)avformat_write_header(cfg->handle.av.format, NULL); in bt_play_aac_transfer()
977 av_write_frame(cfg->handle.av.format, pkt); in bt_play_aac_transfer()
979 pkt_len = avio_close_dyn_buf(cfg->handle.av.format->pb, &pkt_buf); in bt_play_aac_transfer()
985 memcpy(cfg->mtu_data + cfg->mtu_offset, pkt_buf + 3, pkt_len - 3); in bt_play_aac_transfer()
989 cfg->mtu_offset += pkt_len - 3; in bt_play_aac_transfer()
990 if (cfg->chmode != MODE_MONO) in bt_play_aac_transfer()
991 cfg->mtu_timestamp += cfg->rem_in_size / 4; in bt_play_aac_transfer()
993 cfg->mtu_timestamp += cfg->rem_in_size / 2; in bt_play_aac_transfer()
995 xlen = write(cfg->fd, cfg->mtu_data, cfg->mtu_offset); in bt_play_aac_transfer()
999 return (-1); in bt_play_aac_transfer()
1007 cfg->rem_in_len = 0; in bt_play_aac_transfer()
1020 struct bt_config *cfg = pbe->arg; in bt_play_transfer() local
1022 switch (cfg->codec) { in bt_play_transfer()
1030 return (-1); in bt_play_transfer()
1037 *pdelay = -1; in bt_rec_delay()
1044 *pdelay = -1; in bt_play_delay()