#!/usr/bin/env python3
# vim:ts=4:sts=4:sw=4:expandtab
 
import numpy
import pyaudio
import wave
import sys
 
CHUNK = 1024
CHANNELS = 1
SAMPLE_WIDTH = 2
SAMPLE_TYPE = numpy.dtype('<i2')
SAMPLE_MAX = 2**15 - 1
FRAMERATE = 44000

pa = pyaudio.PyAudio()

def wave_open(path):
    audio = wave.open(path, 'rb')
    CHANNELS = audio.getnchannels()
    FRAMERATE = audio.getframerate()
    SAMPLE_WIDTH = audio.getsampwidth()
    if SAMPLE_WIDTH == 1:
        SAMPLE_TYPE = numpy.dtype('<i1')
        SAMPLE_MAX = 2**7 - 1
    return audio

def mic_open():
    audio = pa.open(
        input=True,
        channels=CHANNELS,
        rate=FRAMERATE,
        format=pa.get_format_from_width(SAMPLE_WIDTH),
    )
    return audio

def audio_read(audio, chunk=CHUNK):
    if isinstance(audio, wave.Wave_read):
        raw = audio.readframes(chunk)
    else:
        raw = audio.read(chunk, exception_on_overflow=False)
    frames = numpy.frombuffer(raw, dtype=SAMPLE_TYPE).astype(float)
    frames /= SAMPLE_MAX
    frames.clip(-1,1)
    return frames

def audio_close(audio):
    if isinstance(audio, wave.Wave_read):
        audio.close()
    else:
        audio.stop_stream()
        audio.close()
