Contact
← Back to Topics

AVAudio

High-level framework for playing, recording, and processing audio in iOS applications.

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)
        }
    }
}