About AVAudio
AVAudio is part of Apple's AVFoundation framework, providing high-level APIs for audio playback, recording, and processing. It offers a more developer-friendly interface compared to Core Audio while still providing powerful audio capabilities.
Key Features
- Audio playback
- Audio recording
- Audio mixing
- Audio effects
- Audio session management
Code Example
// AVAudio example
import AVFoundation
class AudioPlayerManager {
// Audio player instance
var audioPlayer: AVAudioPlayer?
// Audio engine components
var audioEngine: AVAudioEngine!
var playerNode: AVAudioPlayerNode!
var pitchEffect: AVAudioUnitTimePitch!
// Setup basic audio player
func setupBasicPlayer(with url: URL) {
do {
// Configure audio session
try AVAudioSession.sharedInstance().setCategory(.playback)
try AVAudioSession.sharedInstance().setActive(true)
// Initialize player with audio file
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
} catch {
print("Error setting up audio player: \(error)")
}
}
// Play/pause audio
func togglePlayback() {
if let player = audioPlayer {
if player.isPlaying {
player.pause()
} else {
player.play()
}
}
}
// Setup advanced audio engine with effects
func setupAdvancedPlayer(with url: URL) {
do {
// Create audio file
let audioFile = try AVAudioFile(forReading: url)
// Create audio engine
audioEngine = AVAudioEngine()
// Create player node
playerNode = AVAudioPlayerNode()
audioEngine.attach(playerNode)
// Create pitch effect
pitchEffect = AVAudioUnitTimePitch()
pitchEffect.pitch = 0.0 // No pitch shift initially
audioEngine.attach(pitchEffect)
// Connect nodes
audioEngine.connect(playerNode, to: pitchEffect, format: audioFile.processingFormat)
audioEngine.connect(pitchEffect, to: audioEngine.mainMixerNode, format: audioFile.processingFormat)
// Start engine
try audioEngine.start()
// Schedule audio file for playback
playerNode.scheduleFile(audioFile, at: nil)
} catch {
print("Error setting up audio engine: \(error)")
}
}
// Play with audio engine
func playWithEffects() {
playerNode.play()
}
// Change pitch
func changePitch(to value: Float) {
pitchEffect.pitch = value
}
// Record audio
func recordAudio(to url: URL, completion: @escaping (Error?) -> Void) {
let recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(.record)
try recordingSession.setActive(true)
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
let recorder = try AVAudioRecorder(url: url, settings: settings)
recorder.record()
// In real app, you would handle stopping the recording
} catch {
completion(error)
}
}
}