開発メモ

開発関係のメモをいろいろと。たぶん。

再生関係の基本的な操作に対応

動作を確認した環境

環境 情報
Xcode 6.3.2 (6D2105)
iOS 8.3
Swift 1.2
Date 2015/6/5

再生関係の基本的な操作に対応

MusicPlayer関係の処理が増えるのは目に見えてるので、MPMusicPlayerControllerを管理するためのクラスをあらかじめ用意。再生のテスト用に、すべての曲を再生キューにセットする処理を入れておく。

import Foundation
import MediaPlayer

/// MPMusicPlayerControllerを管理するためのクラス
class SK4MusicPlayerAdmin: NSObject {

    /// アプリ全体で使用するMPMusicPlayerController
    let player = MPMusicPlayerController.systemMusicPlayer()

    ////////////////////////////////////////////////////////////////
    // MARK: - 再生キュー

    /// すべての曲を再生キューにセット
    func allSongsToQueue() {
        let query = MPMediaQuery.songsQuery()
        player.setQueueWithQuery(query)
    }

    ////////////////////////////////////////////////////////////////
    // MARK: - 基本操作

    /// 再生
    func play() {
        player.play()
    }

    /// 一時停止
    func pause() {
        player.pause()
    }

    /// 1つ前の曲に移動
    func skipToPreviousItem() {
        player.skipToPreviousItem()
    }

    /// 1つ後の曲に移動
    func skipToNextItem() {
        player.skipToNextItem()
    }

}

あとは、それぞれのアクションで、対応する処理を呼ぶようにするだけ。

import UIKit

let g_musicPlayer = SK4MusicPlayerAdmin()

class ViewController: UIViewController {

    @IBAction func onRepeat(sender: AnyObject) {
        println(__FUNCTION__)
    }

    @IBAction func onPrev(sender: AnyObject) {
        g_musicPlayer.skipToPreviousItem()
    }

    @IBAction func onPause(sender: AnyObject) {
        g_musicPlayer.pause()
    }

    @IBAction func onPlay(sender: AnyObject) {
        g_musicPlayer.play()
    }

    @IBAction func onNext(sender: AnyObject) {
        g_musicPlayer.skipToNextItem()
    }

    @IBAction func onShuffle(sender: AnyObject) {
        println(__FUNCTION__)
    }

    ////////////////////////////////////////////////////////////////

    override func viewDidLoad() {
        super.viewDidLoad()

        g_musicPlayer.allSongsToQueue()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

ここまで出来たら、実機で実行して動作を確認。MPMusicPlayerController関係の処理は、iOS Simulatorで確認できないのが面倒で残念。せめて、実機にコンパイルする際に、いちいちStandard Libraryをコピーするのだけでもどうにかしてくれれば・・・

これで、基本的な再生/一時停止/前の曲に移動/次の曲に移動まで出来るようになった。リピートとシャッフルへの対応は後回し。

プログラムとしては、MPMusicPlayerControllerの管理クラスを、あっさりグローバル変数に持ってるのがポイント? C/C++の時代には忌み嫌われてたグローバル変数だけど・・・ Swiftでは、そこまで嫌う必要も無いんじゃないかな、と。

https://itunes.apple.com/jp/app/46-minute-shuffle/id991599315?mt=8&uo=4&at=10l8JW&ct=hatenablog