# HG changeset patch # User Amine Sehili # Date 1548876285 -3600 # Node ID 97be2ee272b2c617b4c7adbb043cb5cd8e737aa8 # Parent 0d4a23668858193097f95bfe85f6cb1623cd152e Add _extract_selected_channel function diff -r 0d4a23668858 -r 97be2ee272b2 auditok/io.py --- a/auditok/io.py Wed Jan 23 20:18:21 2019 +0100 +++ b/auditok/io.py Wed Jan 30 20:24:45 2019 +0100 @@ -23,11 +23,16 @@ from_file player_for """ - from abc import ABCMeta, abstractmethod import os import sys import wave +from array import array + +if sys.version_info >= (3, 0): + PYTHON_3 = True +else: + PYTHON_3 = False try: from pydub import AudioSegment @@ -151,6 +156,32 @@ return tuple(parameters) + (_normalize_use_channel(use_channel),) +def _array_to_bytes(a): + """ + Converts an `array.array` to `bytes`. + """ + if PYTHON_3: + return a.tobytes() + else: + return a.tostring() + + +def _extract_selected_channel(data, channels, sample_width, use_channel): + if use_channel == "mix": + return _mix_audio_channels(data, channels, sample_width) + elif use_channel >= channels or use_channel < -channels: + err_message = "use_channel == {} but audio data has only {} channel{}." + err_message += " Selected channel must be 'mix' or an integer >= " + err_message += "-channels and < channels" + err_message = err_message.format( + use_channel, channels, "s" if channels > 1 else "" + ) + raise AudioParameterError(err_message) + fmt = DATA_FORMAT[sample_width] + buffer = array(fmt, data) + return _array_to_bytes(buffer[use_channel::channels]) + + class AudioSource: """ Base class for audio source objects. diff -r 0d4a23668858 -r 97be2ee272b2 tests/test_io.py --- a/tests/test_io.py Wed Jan 23 20:18:21 2019 +0100 +++ b/tests/test_io.py Wed Jan 30 20:24:45 2019 +0100 @@ -10,6 +10,7 @@ DATA_FORMAT, AudioParameterError, check_audio_data, + _array_to_bytes, _save_raw, _save_wave, ) @@ -34,16 +35,6 @@ return (sample for frame in frame_gen for sample in frame) -def _array_to_bytes(a): - """ - Converts an `array.array` to `bytes`. - """ - if PYTHON_3: - return a.tobytes() - else: - return a.tostring() - - def _generate_pure_tone( frequency, duration_sec=1, sampling_rate=16000, sample_width=2, volume=1e4 ):