import samplerate
import numpy as np

def mergeChunkChannels(chunk, channels):
    """
    将当前多通道音频数据块转换为单通道音频数据块

    Args:
        chunk: (bytes)多通道音频数据块
        channels: 通道数

    Returns:
        (bytes)单通道音频数据块
    """
    # (length * channels,)
    chunk_np = np.frombuffer(chunk, dtype=np.int16)
    # (length, channels)
    chunk_np = chunk_np.reshape(-1, channels)
    # (length,)
    chunk_mono_f = np.mean(chunk_np.astype(np.float32), axis=1)
    chunk_mono = np.round(chunk_mono_f).astype(np.int16)
    return chunk_mono.tobytes()


def resampleRawChunk(chunk, channels, orig_sr, target_sr, mode="sinc_best"):
    """
    将当前多通道音频数据块转换成单通道音频数据块，然后进行重采样

    Args:
        chunk: (bytes)多通道音频数据块
        channels: 通道数
        orig_sr: 原始采样率
        target_sr: 目标采样率
        mode: 重采样模式，可选：'sinc_best' | 'sinc_medium' | 'sinc_fastest' | 'zero_order_hold' | 'linear'

    Return:
        (bytes)单通道音频数据块
    """
    # (length * channels,)
    chunk_np = np.frombuffer(chunk, dtype=np.int16)
    # (length, channels)
    chunk_np = chunk_np.reshape(-1, channels)
    # (length,)
    chunk_mono_f = np.mean(chunk_np.astype(np.float32), axis=1)
    chunk_mono = chunk_mono_f.astype(np.int16)
    ratio = target_sr / orig_sr
    chunk_mono_r =  samplerate.resample(chunk_mono, ratio, converter_type=mode)
    chunk_mono_r = np.round(chunk_mono_r).astype(np.int16)
    return chunk_mono_r.tobytes()

def resampleMonoChunk(chunk, orig_sr, target_sr, mode="sinc_best"):
    """
    将当前单通道音频块进行重采样

    Args:
        chunk: (bytes)单通道音频数据块
        orig_sr: 原始采样率
        target_sr: 目标采样率
        mode: 重采样模式，可选：'sinc_best' | 'sinc_medium' | 'sinc_fastest' | 'zero_order_hold' | 'linear'

    Return:
        (bytes)单通道音频数据块
    """
    chunk_np = np.frombuffer(chunk, dtype=np.int16)
    ratio = target_sr / orig_sr
    chunk_r =  samplerate.resample(chunk_np, ratio, converter_type=mode)
    chunk_r = np.round(chunk_r).astype(np.int16)
    return chunk_r.tobytes()
