HuggingChat-Mac/Views/AudioMeterIndicator.swift (32 lines of code) (raw):

// // AudioMeterIndicator.swift // HuggingChat-Mac // // Created by Cyril Zakka on 9/17/24. // import SwiftUI struct AudioMeterIndicator: View { var bufferEnergy: [Float] = (0..<20).map { _ in 0 } var barCount: Int = 20 let maxHeight: CGFloat = 24 let barWidth: CGFloat = 3 let cornerRadius: CGFloat = 2 let spacing: CGFloat = 1 var body: some View { HStack(alignment: .center, spacing: spacing) { ForEach(0..<barCount, id: \.self) { index in bar(energy: normalizedEnergy(at: index)) } } .frame(height: maxHeight) } private func bar(energy: CGFloat) -> some View { RoundedRectangle(cornerRadius: cornerRadius) .fill(.secondary) .frame(width: barWidth, height: (0.1 + energy) * maxHeight, alignment: .center) .animation(.spring(response: 0.3, dampingFraction: 0.5, blendDuration: 0), value: energy) } private func normalizedEnergy(at index: Int) -> CGFloat { guard index < bufferEnergy.count else { return 0 } return CGFloat(max(0, min(1, bufferEnergy[index]))) } } #Preview { AudioBarView() .environment(AudioModelManager()) .frame(width: 95, height: 30) }