fix support for float32

This commit is contained in:
Gilles Boccon-Gibod
2025-02-08 18:12:45 -05:00
parent 5f2d24570e
commit 859bb0609f
2 changed files with 19 additions and 7 deletions

View File

@@ -924,6 +924,14 @@ async def run_transmit(
if pcm_format.channels != 2: if pcm_format.channels != 2:
print("Only 2 channels PCM configurations are supported") print("Only 2 channels PCM configurations are supported")
return return
if pcm_format.sample_type == audio_io.PcmFormat.SampleType.INT16:
pcm_bit_depth = 16
elif pcm_format.sample_type == audio_io.PcmFormat.SampleType.FLOAT32:
pcm_bit_depth = None
else:
print("Only INT16 and FLOAT32 sample types are supported")
return
encoder = lc3.Encoder( encoder = lc3.Encoder(
frame_duration_us=AURACAST_DEFAULT_FRAME_DURATION, frame_duration_us=AURACAST_DEFAULT_FRAME_DURATION,
sample_rate_hz=AURACAST_DEFAULT_SAMPLE_RATE, sample_rate_hz=AURACAST_DEFAULT_SAMPLE_RATE,
@@ -971,7 +979,7 @@ async def run_transmit(
frame_count = 0 frame_count = 0
async for pcm_frame in audio_input.frames(lc3_frame_samples): async for pcm_frame in audio_input.frames(lc3_frame_samples):
lc3_frame = encoder.encode( lc3_frame = encoder.encode(
pcm_frame, num_bytes=2 * lc3_frame_size, bit_depth=16 pcm_frame, num_bytes=2 * lc3_frame_size, bit_depth=pcm_bit_depth
) )
mid = len(lc3_frame) // 2 mid = len(lc3_frame) // 2
@@ -1150,7 +1158,8 @@ def receive(
"Use 'auto' for .wav files, or for the default setting with the devices. " "Use 'auto' for .wav files, or for the default setting with the devices. "
"For other inputs, the format is specified as " "For other inputs, the format is specified as "
"<sample-type>,<sample-rate>,<channels> (supported <sample-type>: 'int16le' " "<sample-type>,<sample-rate>,<channels> (supported <sample-type>: 'int16le' "
"for 16 bit signed integers with little-endian byte order)" "for 16-bit signed integers with little-endian byte order or 'float32le' for "
"32-bit floating point with little-endian byte order)"
), ),
) )
@click.option( @click.option(

View File

@@ -68,7 +68,7 @@ class PcmFormat:
sample_type_str, sample_rate_str, channels_str = format_str.split(',') sample_type_str, sample_rate_str, channels_str = format_str.split(',')
if sample_type_str == 'int16le': if sample_type_str == 'int16le':
sample_type = cls.SampleType.INT16 sample_type = cls.SampleType.INT16
elif sample_rate_str == 'float32le': elif sample_type_str == 'float32le':
sample_type = cls.SampleType.FLOAT32 sample_type = cls.SampleType.FLOAT32
else: else:
raise ValueError(f'sample type {sample_type_str} not supported') raise ValueError(f'sample type {sample_type_str} not supported')
@@ -77,6 +77,10 @@ class PcmFormat:
return cls(endianness, sample_type, sample_rate, channels) return cls(endianness, sample_type, sample_rate, channels)
@property
def bytes_per_sample(self) -> int:
return 2 if self.sample_type == self.SampleType.INT16 else 4
def check_audio_output(output: str) -> bool: def check_audio_output(output: str) -> bool:
if output == 'device' or output.startswith('device:'): if output == 'device' or output.startswith('device:'):
@@ -486,7 +490,9 @@ class StreamAudioInput(ThreadedAudioInput):
return self._pcm_format return self._pcm_format
def _read(self, frame_size: int) -> bytes: def _read(self, frame_size: int) -> bytes:
return self._stream.read(frame_size * self._pcm_format.channels * 2) return self._stream.read(
frame_size * self._pcm_format.channels * self._pcm_format.bytes_per_sample
)
class FileAudioInput(StreamAudioInput): class FileAudioInput(StreamAudioInput):
@@ -496,9 +502,6 @@ class FileAudioInput(StreamAudioInput):
self._stream = open(filename, "rb") self._stream = open(filename, "rb")
super().__init__(self._stream, pcm_format) super().__init__(self._stream, pcm_format)
def _read(self, frame_size: int) -> bytes:
return self._stream.read(frame_size * self._pcm_format.channels * 2)
def _close(self) -> None: def _close(self) -> None:
self._stream.close() self._stream.close()