AVAudioPlayer (2)

meteringEnabled

AVAudioPlayerにレベルメータを付けました。Swiftで書かれていますが、最適ではありません。

//  AppDelegate.swift

import Cocoa
import AVFoundation

var player : AVAudioPlayer!

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate, AVAudioPlayerDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet weak var myCustomView: NSView!
    

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        self.window.delegate = self
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "update", userInfo: nil, repeats: true)
        
        let audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("test", ofType: "wav")!)
        player  = try! AVAudioPlayer(contentsOfURL: audioPath, fileTypeHint: nil)
        player.meteringEnabled = true
        player.prepareToPlay()
        player.play()
        player.delegate = self
    }

    func update() {
        myCustomView.display()
    }
    
}
//  MyView.swift

import Cocoa

class MyView: NSView {
    
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        
        NSColor.grayColor().set()
        NSRectFill(self.bounds)

        let rect4 = NSMakeRect (20, 80, 600, 10)
        NSColor(red: 0.4, green: 0.4, blue: 0.8, alpha: 1.0).set();
        NSRectFill(rect4)

        let dur = player?.duration
        let cur = player?.currentTime
        
        if cur != nil && dur != nil {
            
            let y3 = CGFloat( 600.0 * cur! / dur!)
            let rect3 = NSMakeRect (20 + y3, 80,  10, 10)
            NSColor(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0).set();
            NSRectFill(rect3)
            
            for var ch: Int = 0; ch < 2; ch++ {
                switch ch {
                case 0: NSColor(red: 0.8, green: 1.0, blue: 0.4, alpha: 1.0).set()
                case 1: NSColor(red: 0.4, green: 0.8, blue: 1.0, alpha: 1.0).set()
                default: break
                }
                player?.updateMeters()
                let ave = player?.averagePowerForChannel(ch)
                if ave != nil {
                    let nbar = CGFloat (600.0 * (ave! + 160.0) / 160.0)
                    let y2   = CGFloat (10 + 35 * ch)
                    let rect2 = NSMakeRect(20, y2, nbar, 30)
                    NSRectFill(rect2)
                }
            }
            
            let font = NSFont.boldSystemFontOfSize(40)
            let textFontAttributes = [
                NSFontAttributeName: font,
                NSForegroundColorAttributeName: NSColor.whiteColor()
            ]
            
            let dd : Int = Int(dur!)
            let cc : Int = Int(cur!)
            let s:String = " duration: \(dd)sec, current: \(cc)sec"
            s.drawInRect(self.bounds, withAttributes: textFontAttributes)
        }
    }
}