// // ContentView.swift // monoclient // // Created by ivabus on 03.03.2024. // import AVFAudio import SwiftUI class MonoLib { func run(server: String) async { let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory( .playback, mode: .default, policy: .longFormAudio) try audioSession.setActive(true) } catch { print("Failed to set the audio session configuration") } c_start(server) } } struct ContentView: View { let timer = Timer.publish(every: 0.25, on: .main, in: .common).autoconnect() @State private var server: String = "ivabus.dev" @State private var port: String = "5894" @State private var playing: Bool = true @State private var running: Bool = false @State var now_playing_artist: String = "" @State var now_playing_album: String = "" @State var now_playing_title: String = "" var body: some View { VStack { Text("Monoclient").font(.largeTitle).fontWidth(.expanded).bold() VStack(alignment: .center) { HStack { Text("Server").frame(minWidth: 50, idealWidth: 60) TextField( "Required", text: $server ) .disableAutocorrection(true) } .textFieldStyle(.roundedBorder) HStack { Text("Port").frame(minWidth: 50, idealWidth: 60) TextField( "Required", text: $port ) .disableAutocorrection(true).keyboardType(.numberPad).keyboardShortcut(.escape) } .textFieldStyle(.roundedBorder) Button(action: { if running { playing = !playing c_toggle() } running = true let a = MonoLib() Task.init { await a.run(server: server + ":" + port) } }) { Image( systemName: running ? (playing ? "pause.circle.fill" : "play.circle") : "infinity.circle" ).font(.largeTitle) }.buttonStyle( .borderedProminent) HStack{ Button(action: { c_stop() running = false playing = true }) { Image(systemName: "stop").font(.title3) }.buttonStyle( .bordered ).disabled(!running) Button(action: { c_stop() playing = true let a = MonoLib() Task.init { await a.run(server: server + ":" + port) } }) {Image(systemName: "forward").font(.title3)}.buttonStyle(.bordered).disabled(!running) } }.frame(width: 300) VStack(spacing: 10) { Text(now_playing_artist).onReceive(timer) { _ in now_playing_artist = String(cString: c_get_metadata_artist()!) } Text(now_playing_album).onReceive(timer) { _ in now_playing_album = String(cString: c_get_metadata_album()!) } Text(now_playing_title).onReceive(timer) { _ in now_playing_title = String(cString: c_get_metadata_title()!) }.bold() }.frame(minHeight: 100) }.padding() } } #Preview { ContentView() }