package audio import ( "os" "testing" "time" ) func TestPlayMP3LoopStop(t *testing.T) { testFile := "testdata/test.mp3" if _, err := os.Stat(testFile); os.IsNotExist(err) { t.Skip("测试文件不存在:", testFile) } f, err := os.Open(testFile) if err != nil { t.Fatalf("打开测试文件失败: %v", err) } player, cleanup, err := PlayMP3Loop(f) if err != nil { t.Fatalf("PlayMP3Loop 失败: %v", err) } if player == nil { t.Fatal("player 不应为 nil") } // 等待一小段时间确保播放开始 time.Sleep(100 * time.Millisecond) // 调用清理函数 if err := cleanup(); err != nil { t.Errorf("cleanup 失败: %v", err) } // 验证文件已关闭 if err := f.Close(); err == nil { t.Error("文件应该已经被 cleanup 关闭") } } func TestConcurrentPlay(t *testing.T) { testFile := "testdata/test.mp3" if _, err := os.Stat(testFile); os.IsNotExist(err) { t.Skip("测试文件不存在:", testFile) } // 启动多个并发播放 const numPlayers = 3 players := make([]any, numPlayers) cleanups := make([]func() error, numPlayers) for i := 0; i < numPlayers; i++ { f, err := os.Open(testFile) if err != nil { t.Fatalf("打开测试文件 %d 失败: %v", i, err) } player, cleanup, err := PlayMP3Loop(f) if err != nil { t.Fatalf("PlayMP3Loop %d 失败: %v", i, err) } players[i] = player cleanups[i] = cleanup } // 等待播放 time.Sleep(200 * time.Millisecond) // 清理所有播放器 for i, cleanup := range cleanups { if err := cleanup(); err != nil { t.Errorf("cleanup %d 失败: %v", i, err) } } }