using SameBeat.Application.DTO; using SameBeat.Application.Komendy; namespace SameBeat.Application.Interfejsy; /// /// Logika muzyki (ETAP 4) -- biblioteka utworow, playlista biezacego wydarzenia i "zegar" odtwarzania. /// Muzyka NIE idzie przez LiveKit/SignalR jako dzwiek -- kazdy klient sam odtwarza plik spod Utwor.Url /// i synchronizuje swoja pozycje do CzasStartuUtc/PozycjaStartowaMs zwracanych w StanMuzykiDto (to jak /// radio internetowe). Metody sterujace (Odtworz/Wstrzymaj/Nastepny/Poprzedni/UstawGlosnosc) dzialaja /// na biezacym wydarzeniu, tak samo jak ISerwisSceny. /// public interface ISerwisMuzyki { /// Dodaje utwor do globalnej biblioteki. Waliduje tytul/url/czasTrwaniaMs przez WynikOperacji, nie wyjatek. Task> DodajUtworAsync(DodajUtworKomenda komenda, CancellationToken token = default); /// Cala biblioteka utworow. Task>> PobierzUtworyAsync(CancellationToken token = default); /// Dodaje utwor na koniec kolejki biezacego wydarzenia. Zwraca cala kolejke po zmianie. Task>> DodajDoPlaylistyAsync(Guid utworId, CancellationToken token = default); /// Usuwa pozycje z kolejki. Zwraca cala kolejke po zmianie. Task>> UsunZPlaylistyAsync(Guid pozycjaId, CancellationToken token = default); /// Aktualna kolejka biezacego wydarzenia, uporzadkowana, z info ktora pozycja jest aktualnie grana. Task>> PobierzPlaylisteAsync(CancellationToken token = default); /// Biezacy stan zegara -- do wyswietlenia w panelu hosta po odswiezeniu strony i do GET /api/events/current. Task> PobierzStanAsync(CancellationToken token = default); /// /// UtworId podany -- przelacza na ten utwor od 0ms. UtworId brak i muzyka Wstrzymana -- wznawia /// od zapisanej pozycji. UtworId brak i juz Odtwarzana -- no-op (sukces bez zmian). /// Task> OdtworzAsync(Guid? utworId, CancellationToken token = default); /// Wstrzymuje zegar na aktualnie przeliczonej pozycji. Idempotentne. Task> WstrzymajAsync(CancellationToken token = default); /// Nastepny utwor w kolejce (po Kolejnosc) od 0ms. Gdy to byl ostatni -- zatrzymuje (Zatrzymana, UtworId=null). Task> NastepnyAsync(CancellationToken token = default); /// Poprzedni utwor w kolejce od 0ms. Gdy to byl pierwszy -- zatrzymuje (Zatrzymana, UtworId=null). Task> PoprzedniAsync(CancellationToken token = default); /// Ustawia glosnosc master (0.0-1.0). Nie rusza stanu odtwarzania. Task> UstawGlosnoscAsync(float wartosc, CancellationToken token = default); }