#!/usr/bin/env python3
"""
音频录音测试脚本
用于测试树莓派的音频录音功能
"""

import subprocess
import time
import sys
import os
import signal

def test_audio_recording():
    """测试音频录音功能"""
    print("=== 音频录音测试 ===")
    
    # 检查录音设备
    print("\n1. 检查录音设备...")
    try:
        result = subprocess.run(['arecord', '-l'], capture_output=True, text=True)
        if result.returncode == 0:
            print("录音设备列表:")
            print(result.stdout)
        else:
            print("错误: 无法获取录音设备列表")
            return False
    except FileNotFoundError:
        print("错误: arecord 命令未找到，请安装 alsa-utils")
        return False
    
    # 录制测试音频
    print("\n2. 录制测试音频（5秒）...")
    test_record_file = "/tmp/test_record.wav"
    
    try:
        print("请对着麦克风说话（5秒录音开始）...")
        
        # 录制5秒音频
        result = subprocess.run(['arecord', '-d', '5', '-f', 'cd', test_record_file], 
                              capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✓ 音频录制成功")
            
            # 检查文件是否存在且大小合理
            if os.path.exists(test_record_file):
                file_size = os.path.getsize(test_record_file)
                print(f"录制文件大小: {file_size} 字节")
                
                if file_size > 1000:  # 至少1KB
                    print("✓ 录音文件大小正常")
                    return True
                else:
                    print("✗ 录音文件太小，可能录音失败")
                    return False
            else:
                print("✗ 录音文件未创建")
                return False
        else:
            print("✗ 音频录制失败")
            print(f"错误信息: {result.stderr}")
            return False
            
    except FileNotFoundError:
        print("错误: arecord 命令未找到")
        return False
    except KeyboardInterrupt:
        print("\n录音被用户中断")
        return False

def test_audio_playback_verification():
    """播放录制的音频进行验证"""
    print("\n3. 播放录制的音频进行验证...")
    test_record_file = "/tmp/test_record.wav"
    
    if not os.path.exists(test_record_file):
        print("错误: 找不到录制的音频文件")
        return False
    
    try:
        print("播放录制的音频...")
        result = subprocess.run(['aplay', test_record_file], capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✓ 录音播放成功")
            return True
        else:
            print("✗ 录音播放失败")
            print(f"错误信息: {result.stderr}")
            return False
            
    except FileNotFoundError:
        print("错误: aplay 命令未找到")
        return False

def test_microphone_levels():
    """测试麦克风音量级别"""
    print("\n4. 测试麦克风音量级别...")
    
    try:
        # 获取麦克风音量
        result = subprocess.run(['amixer', 'sget', 'Capture'], capture_output=True, text=True)
        
        if result.returncode == 0:
            print("当前麦克风音量:")
            print(result.stdout)
            
            # 设置麦克风音量
            subprocess.run(['amixer', 'sset', 'Capture', '80%'], check=True)
            print("✓ 麦克风音量已设置为80%")
            return True
        else:
            print("无法获取麦克风音量信息")
            return False
            
    except (subprocess.CalledProcessError, FileNotFoundError):
        print("amixer 命令未找到或执行失败")
        return False

def test_realtime_monitoring():
    """实时音频监控测试"""
    print("\n5. 实时音频监控测试（3秒）...")
    
    try:
        print("开始实时监控，请对着麦克风说话...")
        
        # 使用parecord进行实时监控（如果可用）
        cmd = ['parecord', '--monitor', '--latency-msec', '100', '--duration', '3', '/dev/null']
        
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=5)
        
        if result.returncode == 0:
            print("✓ 实时监控测试成功")
            return True
        else:
            print("提示: 实时监控测试跳过（需要pulseaudio）")
            return True
            
    except (subprocess.TimeoutExpired, FileNotFoundError, subprocess.CalledProcessError):
        print("提示: 实时监控测试跳过")
        return True

def cleanup():
    """清理测试文件"""
    test_files = ["/tmp/test_record.wav"]
    
    for file_path in test_files:
        if os.path.exists(file_path):
            try:
                os.remove(file_path)
                print(f"✓ 已清理测试文件: {file_path}")
            except OSError:
                print(f"警告: 无法清理测试文件: {file_path}")

if __name__ == "__main__":
    print("树莓派音频录音功能测试")
    print("=" * 40)
    
    success = True
    
    # 测试麦克风音量
    if not test_microphone_levels():
        success = False
    
    # 测试音频录制
    if not test_audio_recording():
        success = False
    
    # 播放录制的音频
    if os.path.exists("/tmp/test_record.wav"):
        if not test_audio_playback_verification():
            success = False
    
    # 实时监控测试
    if not test_realtime_monitoring():
        success = False
    
    print("\n" + "=" * 40)
    if success:
        print("✓ 所有音频录音测试通过")
    else:
        print("✗ 部分音频录音测试失败")
    
    # 清理测试文件
    cleanup()
    
    sys.exit(0 if success else 1)