using SameBeat.Application.DTO; namespace SameBeat.Application.Interfejsy; /// /// Logika mikrofonu (ETAP 5) -- NAJWAZNIEJSZA funkcja produktu: host przyznaje uczestnikowi na scenie /// mikrofon na dokladnie okreslony czas, a serwer (nie przegladarka) autorytatywnie ten czas /// egzekwuje, patrz SerwisTimeraMikrofonu. Jeden aktywny mikrofon na raz w ramach wydarzenia -- host /// musi najpierw przerwac poprzedni, zanim przyzna nowy (swiadome uproszczenie, patrz Wydarzenie). /// public interface ISerwisMikrofonu { /// Biezacy stan mikrofonu -- do wyswietlenia w panelu hosta po odswiezeniu strony i do GET /api/events/current. Task> PobierzStanAsync(CancellationToken token = default); /// /// Przyznaje mikrofon uczestnikowi (musi miec Status=NaScenie) na czasSekundy. Odmawia, gdy ktos /// inny ma juz aktywny mikrofon -- host musi go najpierw przerwac. Best-effort woła LiveKit, zeby /// FIZYCZNIE dopisac "microphone" do canPublishSources aktywnego polaczenia uczestnika. /// Task> PrzyznajAsync(Guid uczestnikId, int czasSekundy, string przyznalHostNick, CancellationToken token = default); /// /// Reczne, natychmiastowe przerwanie przez hosta -- ta sama logika odbierania co przy wygasnieciu /// timera. Idempotentne: gdy podany uczestnik akurat nie ma aktywnego mikrofonu (juz wygasl albo /// nigdy go nie mial), to no-op zwracajacy biezacy stan, nie blad. /// Task> PrzerwijAsync(Guid uczestnikId, CancellationToken token = default); /// /// Wywolywane cyklicznie przez SerwisTimeraMikrofonu (co ok. 1 sekunde) -- sprawdza, czy aktywny /// mikrofon biezacego wydarzenia wlasnie wygasl (AktywnyMikrofonKoniecUtc < teraz) i jesli tak, /// odbiera go dokladnie tak samo jak PrzerwijAsync. Zwraca null, gdy nic sie nie zmienilo (nie ma /// aktywnego mikrofonu albo jeszcze nie wygasl) -- wtedy caller nie ma czego rozglaszac przez SignalR. /// Task SprawdzIOdbierzWygasleAsync(CancellationToken token = default); }