Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def decode_file(filename: str, output_format: SampleFormat = SampleFormat.SIGNED16,
nchannels: int = 2, sample_rate: int = 44100, dither: DitherMode = DitherMode.NONE) -> DecodedSoundFile:
"""Convenience function to decode any supported audio file to raw PCM samples in your chosen format."""
sample_width = _width_from_format(output_format)
samples = _array_proto_from_format(output_format)
filenamebytes = _get_filename_bytes(filename)
frames = ffi.new("ma_uint64 *")
data = ffi.new("void **")
decoder_config = lib.ma_decoder_config_init(output_format.value, nchannels, sample_rate)
decoder_config.ditherMode = dither.value
result = lib.ma_decode_file(filenamebytes, ffi.addressof(decoder_config), frames, data)
if result != lib.MA_SUCCESS:
raise DecodeError("failed to decode file", result)
buffer = ffi.buffer(data[0], frames[0] * nchannels * sample_width)
samples.frombytes(buffer)
return DecodedSoundFile(filename, nchannels, sample_rate, output_format, samples)
def flac_read_file_f32(filename: str) -> DecodedSoundFile:
"""Reads and decodes the whole flac audio file. Resulting sample format is 32 bits float."""
filenamebytes = _get_filename_bytes(filename)
channels = ffi.new("unsigned int *")
sample_rate = ffi.new("unsigned int *")
num_frames = ffi.new("drflac_uint64 *")
memory = lib.drflac_open_file_and_read_pcm_frames_f32(filenamebytes, channels, sample_rate, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode file")
try:
samples = array.array('f')
buffer = ffi.buffer(memory, num_frames[0] * channels[0] * 4)
samples.frombytes(buffer)
return DecodedSoundFile(filename, channels[0], sample_rate[0], SampleFormat.FLOAT32, samples)
finally:
lib.drflac_free(memory, ffi.NULL)
def flac_read_file_s32(filename: str) -> DecodedSoundFile:
"""Reads and decodes the whole flac audio file. Resulting sample format is 32 bits signed integer."""
filenamebytes = _get_filename_bytes(filename)
channels = ffi.new("unsigned int *")
sample_rate = ffi.new("unsigned int *")
num_frames = ffi.new("drflac_uint64 *")
memory = lib.drflac_open_file_and_read_pcm_frames_s32(filenamebytes, channels, sample_rate, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode file")
try:
samples = _create_int_array(4)
buffer = ffi.buffer(memory, num_frames[0] * channels[0] * 4)
samples.frombytes(buffer)
return DecodedSoundFile(filename, channels[0], sample_rate[0], SampleFormat.SIGNED32, samples)
finally:
lib.drflac_free(memory, ffi.NULL)
def flac_read_s16(data: bytes) -> DecodedSoundFile:
"""Reads and decodes the whole flac audio data. Resulting sample format is 16 bits signed integer."""
channels = ffi.new("unsigned int *")
sample_rate = ffi.new("unsigned int *")
num_frames = ffi.new("drflac_uint64 *")
memory = lib.drflac_open_memory_and_read_pcm_frames_s16(data, len(data), channels, sample_rate, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode data")
try:
samples = _create_int_array(2)
buffer = ffi.buffer(memory, num_frames[0] * channels[0] * 2)
samples.frombytes(buffer)
return DecodedSoundFile("", channels[0], sample_rate[0], SampleFormat.SIGNED16, samples)
finally:
lib.drflac_free(memory, ffi.NULL)
def flac_read_file_s16(filename: str) -> DecodedSoundFile:
"""Reads and decodes the whole flac audio file. Resulting sample format is 16 bits signed integer."""
filenamebytes = _get_filename_bytes(filename)
channels = ffi.new("unsigned int *")
sample_rate = ffi.new("unsigned int *")
num_frames = ffi.new("drflac_uint64 *")
memory = lib.drflac_open_file_and_read_pcm_frames_s16(filenamebytes, channels, sample_rate, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode file")
try:
samples = _create_int_array(2)
buffer = ffi.buffer(memory, num_frames[0] * channels[0] * 2)
samples.frombytes(buffer)
return DecodedSoundFile(filename, channels[0], sample_rate[0], SampleFormat.SIGNED16, samples)
finally:
lib.drflac_free(memory, ffi.NULL)
def mp3_read_file_s16(filename: str, want_nchannels: int = 0, want_sample_rate: int = 0) -> DecodedSoundFile:
"""Reads and decodes the whole mp3 audio file. Resulting sample format is 16 bits signed integer."""
filenamebytes = _get_filename_bytes(filename)
config = ffi.new("drmp3_config *")
config.outputChannels = want_nchannels
config.outputSampleRate = want_sample_rate
num_frames = ffi.new("drmp3_uint64 *")
memory = lib.drmp3_open_file_and_read_pcm_frames_s16(filenamebytes, config, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode file")
try:
samples = _create_int_array(2)
buffer = ffi.buffer(memory, num_frames[0] * config.outputChannels * 2)
samples.frombytes(buffer)
return DecodedSoundFile(filename, config.outputChannels, config.outputSampleRate,
SampleFormat.SIGNED16, samples)
finally:
lib.drmp3_free(memory, ffi.NULL)
def mp3_read_file_f32(filename: str, want_nchannels: int = 0, want_sample_rate: int = 0) -> DecodedSoundFile:
"""Reads and decodes the whole mp3 audio file. Resulting sample format is 32 bits float."""
filenamebytes = _get_filename_bytes(filename)
config = ffi.new("drmp3_config *")
config.outputChannels = want_nchannels
config.outputSampleRate = want_sample_rate
num_frames = ffi.new("drmp3_uint64 *")
memory = lib.drmp3_open_file_and_read_pcm_frames_f32(filenamebytes, config, num_frames, ffi.NULL)
if not memory:
raise DecodeError("cannot load/decode file")
try:
samples = array.array('f')
buffer = ffi.buffer(memory, num_frames[0] * config.outputChannels * 4)
samples.frombytes(buffer)
return DecodedSoundFile(filename, config.outputChannels, config.outputSampleRate,
SampleFormat.FLOAT32, samples)
finally:
lib.drmp3_free(memory, ffi.NULL)
selected_device = choose_device()
capture = miniaudio.CaptureDevice(buffersize_msec=1000, sample_rate=44100, device_id=selected_device["id"])
generator = record_to_buffer()
print("Recording for 3 seconds")
next(generator)
capture.start(generator)
sleep(3)
capture.stop()
buffer = b"".join(buffer_chunks)
print("\nRecorded", len(buffer), "bytes")
print("Wring to ./capture.wav")
samples = array.array('h')
samples.frombytes(buffer)
sound = miniaudio.DecodedSoundFile('capture', capture.nchannels, capture.sample_rate, capture.format, samples)
miniaudio.wav_write_file('capture.wav', sound)
print("Recording done")