mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05: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