changeset 116:97be2ee272b2

Add _extract_selected_channel function
author Amine Sehili <amine.sehili@gmail.com>
date Wed, 30 Jan 2019 20:24:45 +0100
parents 0d4a23668858
children 6c81dac04c03
files auditok/io.py tests/test_io.py
diffstat 2 files changed, 33 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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
 ):