2016-04-27 11 views
11

私はNSSoundのオブジェクトをAVAudioPlayerインスタンスに変換したいと思っています。 NSSoundオブジェクトに関連付けられたファイルパス(NSURL)がありますが、元のファイルが存在しない可能性があります。ここで私はこれまで持っているものです。NSSoundをAVAudioPlayerに変換する

class SoundObj: NSObject { 
    var path: NSURL? 
    var sound: NSSound? 
    var player: AVAudioPlayer 
} 

let aSound = SoundObj() 
aSound.path = NSURL(fileURLWithPath: "file:///path/to/sound.m4a") 
aSound.sound = NSSound(contentsOfURL: aSound.path)! 

do { 
    try aSound.player = AVAudioPlayer(contentsOfURL: aSound.path) 
} catch { 
    // perhaps use AVAudioPlayer(data: ...)? 
} 

私はAVAudioPlayerインスタンスにNSSoundオブジェクトを変換するにはどうすればよいですか?

+0

オーディオファイルが存在しない場合、この回線はクラッシュしませんか? 'aSound.sound = NSSound(contentsOfURL:aSound.path)! ' – brimstone

+0

はい、この場合、' .sound'は決してnullではありません。 – Matt

+0

正直なところ、私はあなたがNSSoundから健全なデータを得ることはできないと思います。 – brimstone

答えて

2

NSSoundオブジェクトからURLを取得するためのパブリックインターフェイスが表示されないため、private headersを検索して何が見つかりましたかを確認しました。そこにはプライベートインスタンスメソッドurl_urlがあり、URLはNSSoundです。おそらく、これはNSURLのivarまたはプロパティのゲッターです。

Objective-Cでは、これは簡単です:新しいインターフェイスまたは拡張機能にメソッドを追加するだけです。純粋スウィフトで物事は少しトリッキーであり、我々は、Objective-Cのプロトコルを介してアクセサを公開する必要があります。

@objc protocol NSSoundPrivate { 
    var url: NSURL? { get } 
} 

urlはインスタンスメソッドであるので、あなたが代わりに変数を使用してのfunc url() -> NSURL?とのより良い結果を得ることができます。あなたの額は変わるかもしれません:varを使って私にとってはうまくいくと思われる読み取り専用プロパティの動作をエミュレートします。

私はAVAudioPlayer上の拡張で新しい利便初期化子を書いた:

extension AVAudioPlayer { 
    convenience init?(sound: NSSound) throws {  
     let privateSound = unsafeBitCast(sound, NSSoundPrivate.self)  
     guard let url = privateSound.url else { return nil } 
     do { 
      try self.init(contentsOfURL: url) 
     } catch { 
      throw error 
     } 
    } 
} 

使用法:アイバーズでNSDataに関連する何かを見つけるためにしようとした後

let url = NSURL(...)  
if let sound = NSSound(contentsOfURL: url, byReference: true) { 
    do { 
     let player = try AVAudioPlayer(sound: sound) 
     player?.play() 
    } catch { 
     print(error) 
    }   
} 

、インスタンスメソッド、および特性をNSSoundを使って、NSSoundを初期化するために使用するもののデータ部分は、クラスの実装のどこかでは難読化されているとの結論に達しました。 URLはです。

関連する問題