mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
bluez5: fix CVSD recording on Intel AX200
Intel 8087:0029 at Firmware revision 0.0 build 191 week 21 2021 on kernel 5.13.19 produces CVSD data stream that consists of 96-byte data packets interleaved with 96-byte zero packets. This seems to not occur on other adapters, which usually produce only 48-byte data packets.
This commit is contained in:
parent
9e94aafaec
commit
dc7b88e1da
1 changed files with 24 additions and 24 deletions
|
|
@ -382,26 +382,22 @@ static void msbc_buffer_append_byte(struct impl *this, uint8_t byte)
|
|||
++this->msbc_buffer_pos;
|
||||
}
|
||||
|
||||
/*
|
||||
Helper function for easier debugging
|
||||
Caveat: If size_read is not a multiple of 16, then the last bytes
|
||||
will not be printed / logged
|
||||
*/
|
||||
static void hexdump_to_log(void *log, uint8_t *read_data, int size_read)
|
||||
/* Helper function for debugging */
|
||||
static SPA_UNUSED void hexdump_to_log(struct spa_log *log, uint8_t *data, size_t size)
|
||||
{
|
||||
|
||||
int rowsize = 16*3;
|
||||
int line_idx = 0;
|
||||
char hexline[16*3] = "";
|
||||
int i;
|
||||
for (i = 0; i < size_read; ++i) {
|
||||
snprintf(&hexline[line_idx], 4, "%02X ", read_data[i]);
|
||||
line_idx += 3;
|
||||
if (line_idx == rowsize) {
|
||||
spa_log_trace(log, "Processing read data: read_data %02i: %s", i-15, hexline);
|
||||
line_idx = 0;
|
||||
}
|
||||
char buf[2048];
|
||||
size_t i, col = 0, pos = 0;
|
||||
buf[0] = '\0';
|
||||
for (i = 0; i < size; ++i) {
|
||||
int res;
|
||||
res = spa_scnprintf(buf + pos, sizeof(buf) - pos, "%s%02x",
|
||||
(col == 0) ? "\n\t" : " ", data[i]);
|
||||
if (res < 0)
|
||||
break;
|
||||
pos += res;
|
||||
col = (col + 1) % 16;
|
||||
}
|
||||
spa_log_trace(log, "hexdump (%d bytes):%s", (int)size, buf);
|
||||
}
|
||||
|
||||
/* helper function to detect if a packet consists only of zeros */
|
||||
|
|
@ -423,12 +419,6 @@ static void preprocess_and_decode_msbc_data(void *userdata, uint8_t *read_data,
|
|||
|
||||
spa_log_trace(this->log, "handling mSBC data");
|
||||
|
||||
/* print hexdump of package */
|
||||
bool flag_hexdump_to_log = false;
|
||||
if (flag_hexdump_to_log) {
|
||||
hexdump_to_log(this->log, read_data, size_read);
|
||||
}
|
||||
|
||||
/* check if the packet contains only zeros - if so ignore the packet.
|
||||
This is necessary, because some kernels insert bogus "all-zero" packets
|
||||
into the datastream.
|
||||
|
|
@ -522,12 +512,22 @@ static int sco_source_cb(void *userdata, uint8_t *read_data, int size_read)
|
|||
|
||||
/* handle data read from socket */
|
||||
spa_log_trace(this->log, "read socket data %d", size_read);
|
||||
#if 0
|
||||
hexdump_to_log(this->log, read_data, size_read);
|
||||
#endif
|
||||
|
||||
if (this->transport->codec == HFP_AUDIO_CODEC_MSBC) {
|
||||
preprocess_and_decode_msbc_data(userdata, read_data, size_read);
|
||||
|
||||
} else {
|
||||
uint8_t *packet;
|
||||
if (size_read != 48 && is_zero_packet(read_data, size_read)) {
|
||||
/* Adapter is returning non-standard CVSD stream. For example
|
||||
* Intel 8087:0029 at Firmware revision 0.0 build 191 week 21 2021
|
||||
* on kernel 5.13.19 produces such data.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
packet = (uint8_t *)datas[0].data + port->ready_offset;
|
||||
spa_memmove(packet, read_data, size_read);
|
||||
port->ready_offset += size_read;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue