Swiftでオブジェクトのアドレスを表示する

Swiftでオブジェクトのメモリアドレスを表示するには?

Objective-Cでは、

UIView* view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
NSLog(@"%p", view);
// 0x13d649b60

と、%pを使うことで、アドレスを知ることができた。


Swiftでは

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
print("\(unsafeAddressOf(view))")
// "0x00007fe8f8708740\n"

と、unsafeAddressOfを用いることで、アドレスを知ることができる。

Autodesk Graphic(旧iDraw)はCore Graphicsのコードを生成できる

Autodesk Graphic(旧iDraw)は、図形からCore Graphicsのコードを書き出せることを先日知ったので、記します。

言語を選択

環境設定 > 読み込み / 書き出し
で、SwiftかObjective-Cかを選択
ss 2016-02-07 8.05.12

クリップボードへ書き出し

必要なレイヤーを選択して、Ctrl+クリック(もしくは編集メニュー)から、
別名でコピー > Core Graphics Codeを選択。
ss 2016-02-14 22.19.30
これでクリッブボードにコードがコピーされています。
ペースト(Ctrl + Vなど)すると、以下のようなコードが貼り付けられます。

#if os(iOS)
    let ctx = UIGraphicsGetCurrentContext() // iOS
#else
    let contextPtr = NSGraphicsContext.currentContext()!.graphicsPort   // OS X
    let opaqueCtx = COpaquePointer(contextPtr)
    let ctx = Unmanaged<CGContext>.fromOpaque(opaqueCtx).takeUnretainedValue()
#endif

// enable the following lines for flipped coordinate systems
// CGContextTranslateCTM(ctx, 0, self.bounds.size.height)
// CGContextScaleCTM(ctx, 1, -1)
let colorSpace = CGColorSpaceCreateDeviceRGB()

let scaleFactor: CGFloat = 1;
// CGContextScaleCTM(ctx, scaleFactor, scaleFactor);

/*  Shape   */
let pathRef = CGPathCreateMutable()
CGPathMoveToPoint(pathRef, nil, 10, -0)
CGPathAddLineToPoint(pathRef, nil, 230, -0)
CGPathAddCurveToPoint(pathRef, nil, 235.523, -0, 240, 4.477, 240, 10)
CGPathAddLineToPoint(pathRef, nil, 240, 121)
CGPathAddCurveToPoint(pathRef, nil, 240, 126.523, 235.523, 131, 230, 131)
CGPathAddLineToPoint(pathRef, nil, 10, 131)
CGPathAddCurveToPoint(pathRef, nil, 4.477, 131, 0, 126.523, 0, 121)
CGPathAddLineToPoint(pathRef, nil, 0, 10)
CGPathAddCurveToPoint(pathRef, nil, 0, 4.477, 4.477, -0, 10, -0)
CGPathCloseSubpath(pathRef)

// (以下略)

省略してしまいましたが、インナーシャドー、グラデーション、輪郭線を用いた角丸四角形と三角形を描くのに130行程度のコードになっています。

生成されたコードからUIImageを作成

生成されたコードでは、CurrentContextを用いて、そこに描画しています。
サイズを指定してContextを作成し、それをCurrentContextとするのには
UIGraphicsBeginImageContextWithOptionsが使えます。

// サイズを指定してContextを作成し、それをCurrentContextとする
// (sizeはCGSize型の変数)  
UIGraphicsBeginImageContextWithOptions(size, false, 0)

// (ここにAutodesk Graphicsが生成したコード)

// CurrentContextからUIImage?の作成  
let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext()

// このContextをスタックから取り除く(CurrentContextではなくなる)
UIGraphicsEndImageContext()


こんなかんじで、UIImageに持ってくることができます。

スケールについて
let scaleFactor: CGFloat = 1;
// CGContextScaleCTM(ctx, scaleFactor, scaleFactor);

生成されたコードではコメントアウトされているCGContextScaleCTMを生かしてscaleFactorを変えれば、スケールの変更ができます。

一部書き方があっていないところあり

Autodesk GraphicのVer 3.0.1を使用しているのですが、一部、書き方がSwift 2.1に適合していない部分がありました。
グラデーションのOption指定部分を修正しました。

// 修正前
CGContextDrawLinearGradient(ctx, gradientRef, CGPoint(x: 130.334, y: 82.171), CGPoint(x: 130.334, y: 44.818), CGGradientDrawingOptions(kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation))
// 修正後
CGContextDrawLinearGradient(ctx, gradientRef, CGPoint(x: 130.334, y: 82.171), CGPoint(x: 130.334, y: 44.818), [.DrawsBeforeStartLocation, .DrawsAfterEndLocation])
テキスト

テキスト部分を書き出してみるとCoreTextを使用したコードで書き出されました。
Path化されてしまうのではなく、テキスト情報が残っています。
ss 2016-02-14 22.54.08

#if os(iOS)
    let ctx = UIGraphicsGetCurrentContext() // iOS
#else
    let contextPtr = NSGraphicsContext.currentContext()!.graphicsPort   // OS X
    let opaqueCtx = COpaquePointer(contextPtr)
    let ctx = Unmanaged<CGContext>.fromOpaque(opaqueCtx).takeUnretainedValue()
#endif

// enable the following lines for flipped coordinate systems
// CGContextTranslateCTM(ctx, 0, self.bounds.size.height)
// CGContextScaleCTM(ctx, 1, -1)
let colorSpace = CGColorSpaceCreateDeviceRGB()

let scaleFactor: CGFloat = 1;
// CGContextScaleCTM(ctx, scaleFactor, scaleFactor);

/*  Text   */
let textBox = CGRect(x: 13.912, y: 5.804, width: 65.76, height: 38)
let textStr: CFString = "ABC"

let attributedStr = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0)
CFAttributedStringReplaceString(attributedStr, CFRange(location: 0, length: 0), textStr)

let fontRef = CTFontCreateWithName("HelveticaNeue", 32, nil)
let textRange = CFRange(location: 0, length: CFAttributedStringGetLength(attributedStr))
CFAttributedStringSetAttribute(attributedStr, textRange, kCTFontAttributeName, fontRef)

let textColorComps: [CGFloat] = [0.953, 0.388, 0.388, 1]
let textColor = CGColorCreate(colorSpace, textColorComps)
CFAttributedStringSetAttribute(attributedStr, textRange, kCTForegroundColorAttributeName, textColor)

var alignment = CTTextAlignment.TextAlignmentCenter
var paragraphSettings = CTParagraphStyleSetting(spec: CTParagraphStyleSpecifier.Alignment, valueSize: UInt(sizeof(UInt8)), value: &alignment)
let paragraphStyle = CTParagraphStyleCreate(&paragraphSettings, 1)
CFAttributedStringSetAttribute(attributedStr, textRange, kCTParagraphStyleAttributeName, paragraphStyle)

let textBoxPath = CGPathCreateWithRect(CGRect(x: 0, y: 0, width: textBox.size.width, height: textBox.size.height), nil)
let framesetter = CTFramesetterCreateWithAttributedString(attributedStr)
let frameRef = CTFramesetterCreateFrame(framesetter, CFRange(location: 0, length: 0), textBoxPath, nil)
CGContextSaveGState(ctx)
CGContextTranslateCTM(ctx, textBox.origin.x, textBox.origin.y)

CGContextSetTextMatrix(ctx, CGAffineTransformIdentity)
CGContextTranslateCTM(ctx, 0.0, textBox.size.height)
CGContextScaleCTM(ctx, 1.0, -1.0)
CTFrameDraw(frameRef, ctx)

CGContextRestoreGState(ctx)

一部でエラーが出たので修正しました

// 修正前
var alignment = CTTextAlignment.TextAlignmentCenter
var paragraphSettings = CTParagraphStyleSetting(spec: CTParagraphStyleSpecifier.Alignment, valueSize: UInt(sizeof(UInt8)), value: &alignment)
// (略)
CTFrameDraw(frameRef, ctx)
// 修正後
var alignment = CTTextAlignment.Center
var paragraphSettings = CTParagraphStyleSetting(spec: CTParagraphStyleSpecifier.Alignment, valueSize: Int(sizeof(UInt8)), value: &alignment)
// (略)
CTFrameDraw(frameRef, ctx!)

ということで、Autodesk GraphicはCore Graphics Codeを書き出せます。

関連

CoreGraphicsコードをSwift 3.0に変換する – nackpan Blog

Swiftで作成中のプロジェクトにObjective-Cのファイルを導入する

Using Swift with Cocoa and Objective-C (Swift 2): Swift and Objective-C in the Same Project
こちらのページにやり方書いてあるので、これに従ってやっていこう。

  1. Objective-Cのファイルを追加する。

  2. 追加するとXcodeが尋ねてくるので、YESとすると、bridging-header.hが作成される。

  3. bridging header fileに、Objective-Cで作成したクラスの必要なヘッダファイルをimportする。

  4. これで、Objective-Cで作ったクラスが扱えるようになる。

やってみよう

RPMediaPlayer.h
RPMediaPlayer.m
RPItem.h
RPItem.m

この4つのファイルを使用したい。

RPMediaPlayer.hはAVFoundationフレームワークと、”RPItem.h”をimportしているのだけども、この場合はどうなるのか?

RPMediaPlayer.h

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

#import "RPItem.h"

@interface RPMediaPlayer : NSObject

- (void)play;

@end

RPMediaPlayer.hファイル追加。そして、RPMediaPlayer.mファイルを追加したところで、Xcodeが尋ねてきた。
ss 2015-10-11 9.43.27
“Create Bridging Header”を選択した。
すると、プロジェクトに、プロジェクト名-Bridging-Header.hファイルが加わっている。

RPItem.h、RPItem.mをプロジェクトに追加。

プロジェクト名-Bridging-Header.hに、

#import “RPMediaPlayer.h”

と記述。

これで、Swift側のファイルから使えるようになった。

ViewController.Swift

import UIKit

class ViewController: UIViewController {
    
    let player = RPMediaPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        player.play()
        
    }

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

}

これでちゃんと動作した。

2014年11,12月開発状況

2014年11,12月開発状況

11月

クラウドストレージから読み込み機能作成中

語学学習支援プレイヤー」をアップデートすべく、開発中。
作成中の機能 : クラウドストレージ(Dropboxなど)のオーディオファイルを読み込んで使用できるようにする

  • クラウドストレージから読み込むさい、フォルダ指定できるようにする。
  • クラウドストレージから読み込み中、他の曲を選択して再生することができる。
  • 読み込みを途中でキャンセルできる。

ファイル管理画面をどうするか?
いままでは、
たとえば、アルバムタブだと、
アルバム一覧ー>各アルバム詳細
のように、一覧ー>詳細
の2層構造。
(「曲」タブのみ、一層)
「ミュージック」アプリの形式に合わせていた。

「クラウドストレージから読み込み」でのファイル管理。
クラウドストレージは、フォルダの中にフォルダをもてる階層構造なので、それを表現できる画面にする必要が有る。
読み込んだ後の「ローカルでのファイル管理」でも階層構造をもつこととする。
ローカルでのファイル管理画面では、フォルダの新規作成、ファイル名変更、アイテム移動(ファイル、フォルダの移動)ができるようにしよう。
まずは、ファイル管理画面で階層構造をもつことができるようにした。
CustomTableViewControllerのテーブルのセルをタップすると、新たなCustomTableControllerのインスタンスを作成し、navigationControllerにpushするようにした。

Dropboxのファイルを扱うには、Dropbox APIを使う。調べた。

Drop-ins
簡単にDropboxファイルにアクセスできる仕組み。Dropbox上のファイルを選択する画面があらかじめ用意されている。
Drop-insにはChooserとSaverがある。
Chooserで、ファイルをひとつ選択すると、複雑なURLを生成する。
これをダウンロードするなりなんなりする。

インターネットとの通信がでてきた。いままでやっていなかったこと。
iOSで、インターネット上のファイルをあつかう機能を調べてみよう。
iOS 7 から登場したNSURLSessionを使うと、URLを指定してその内容をダウンロードする処理が扱いやすい。
NSURLSessionを使って、インターネット上のファイルのダウンロードの実験をやってみた。
NSURLSEssionでは、アプリを閉じてもダウンロード処理できる。複数のタスクをダウンロードできる。
あつかいやすい。

Drop-insのchooser。これは、クラウドストレージの選択画面があらかじめ用意されていて簡便だ。しかし、複数のファイルを選択する方法、フォルダを選択する方法がみあたらない。

そこで、Dropbox APIのCore APIを使うこととした。

12月

Core APIを使ってDropboxからアイテム読み込み

Core APIを使ったダウンロードだと、アプリ終了後のダウンロードはNSURLSessionのようにはできないようだ。
アプリ終了後しばらく動作できるbackground task(iOS 7だと3分間)を使うこととする。

Dropboxからアイテムを読み込む際、フォルダが選択できるようにしたい。
Core APIで、フォルダに相当するURLを指定してもエラーになる。
なので、フォルダの中を順繰りにめぐってファイルpathを取得するようにした。

また同名のアイテムがあった場合、上書き確認の必要。ー> つくった。

途中経過をテーブルに表示する。ー> 読み込み中は、セルにインジケーターとプログレスバーを表示すようにした。

「クラウドストレージから読み込み」では、「アイテム(ファイルもしくはフォルダ)の選択」をおこなう。
フォルダセルをタップしたとき、どう動作するか悩む。
「クラウドストレージから読み込み」では、「アイテム選択」のみ行うので、セルの左2/3ぐらいをタップした場合は、フォルダを選択。セルの右1/3をタップした場合はフォルダの内容を展開することとした。
どこが境界かわからないと、操作に納得感がなかったので、点線をいれた。

ローカルでのフォルダ・ファイルの扱い。

ローカルでは、ファイルのみ選曲できるようにしていたのでこれを踏襲。
編集モードは、アイテム選択して、削除、名前変更、移動ができるようにした。また、フォルダの作成ができるようにした。

削除 : アイテムを削除する。このさい、確認メッセージをだすこと。そのさい、「ファイルひとつ」「フォルダひとつ」「複数ファイル」「複数フォルダ」「複数アイテム」で分けた。
名前変更 : アイテムの名前を変更する。
移動 : アイテムの移動。新たなnavigationControllerを作成。移動用tableControllerをルートフォルダ分から現在表示しているフォルダ分まで作成し、navigationControllerにpushする。そして、naviagationControllerを現在のviewからモーダルに表示するようにした。

フォルダの作成 : 新たなフォルダを作成する。末尾が’.’のフォルダ名などは作成できないようにして、メッセージを表示するようにした。

ここまで、できた。

[Objective-C]MPVolumeViewを使う (外観を変更する)

前回([iOS]MPVolumeViewを使う)のつづき。

iOS7でのMPVolumeViewのデフォルト表示。
defaultVolume
MPVolumeViewは、外観を変更することが出来る。
tintColorの変更で、ツマミの左側の色を変更する。赤色にしてみた。

    myVolumeView.tintColor = [UIColor redColor];

redVolume

画像を用いる場合。

volumeSliderMin@2xvolumeSliderThumb@2xvolumeSliderMax@2x

左から、volumeSliderMin.png, volumeSliderThumb.png, volumeSliderMax.png
Retina用にサイズを2倍したものも用意。

コードは、以下のようになる。

    //// volume viewに画像を指定して、外観を変更する。
    // ツマミの画像
    UIImage* thumbImage = [UIImage imageNamed:@"volumeSliderThumb.png"];
    // Min側の画像
    UIImage* minBase = [UIImage imageNamed:@"volumeSliderMin.png"];
    UIImage* minImage = [minBase resizableImageWithCapInsets:UIEdgeInsetsMake(0, 8, 0, 0)];
    //Max側の画像
    UIImage* maxBase = [UIImage imageNamed:@"volumeSliderMax.png"];
    UIImage* maxImage = [maxBase resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 8)];

    //各画像をセット
    [myVolumeView setMinimumVolumeSliderImage:minImage forState:UIControlStateNormal];
    [myVolumeView setMaximumVolumeSliderImage:maxImage forState:UIControlStateNormal];
    [myVolumeView setVolumeThumbImage:thumbImage forState:UIControlStateNormal];

実機では、このようになってほしい。
customVolumeSlider

ところが、iOS7にアップデートしたところ、画像を用いたMPMediaViewの表示がおかしくなった。
使用機種:iPhone 4s
iOSバージョン:iOS7.0.2
volumeを最大にしている状態、すなわちツマミを右端に寄せている状態で描画した場合に発生。
rightPos
そこから、ツマミを移動すると・・・
wrongversion
右端部分がおかしい。
mighihashi

しかたがないので、右側の画像の透明部分をやめて、背景色で塗った。
correctVersion

[Objective-C]iOSで、ミュージックライブラリにアクセスして音楽を再生する

(2015年9月14日追記。
Swift版の記事を書きました。
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
ごらんください。)


iOSで、ミュージックライブラリにアクセスして音楽を再生する方法。
このappleのドキュメントにライブラリにアクセスして再生する方法、必要な曲を選択する方法、現在再生中の音楽の情報を知る方法等、まとめてある。
(ちなみに、日本語ドキュメント – Apple DeveloperのページにappleのiOS用日本語ドキュメントがまとめてある。英語版へのリンクもある)
今回は、ミュージックライブラリから音楽を選択すると音楽がスタートするようにし、再生、一時停止、停止ができるようにする。
iOSシミュレータでは動作しないので、実機を用いてください。

Single View Applicationでプロジェクトを作成。名前はsampleMusicPlayerにしてみた。 スクリーンショット 2013-08-11 21.37.44

MediaPlayerフレームワークを加える。 スクリーンショット 2013-08-11 21.39.39 「+」ボタンを押すと、フレームワークがずらりと現れるので、そのなかから、MediaPlayer.frameworkを加える。 スクリーンショット 2013-08-11 21.40.19 ViewController.hにMediaPlayerフレームワークをimportする。 スクリーンショット 2013-08-11 21.41.07

ボタンを配置。 スクリーンショット 2013-08-12 11.38.12

ボタンとViewController.mにactionを作成してつなげる。 スクリーンショット 2013-08-12 11.38.27

プレイヤーを表すpropertyをViewController.mに加える。 スクリーンショット 2013-08-12 12.07.33

プレイヤーのインスタンスを作成。 スクリーンショット 2013-08-12 12.18.01 (ここで、applicationMusicPlayerではなく、ipodMusicPlayerを用いると、「ミュージック」での再生状況(再生アイテムや、シャッフル、リピートなどのモード)を反映したものになる)

曲を選択するために、メディアアイテムピッカーを用いる。
(メディアアイテムピッカーというのは、iOSで用意されているあらかじめ設定済みのModalViewController。ミュージックライブラリの選択画面と同じようなことが出来る) スクリーンショット 2013-08-12 13.30.57

(iPodライブラリアクセスプログラミングガイドより)

メディアアイテムピッカーでの「選択完了したとき」や「キャンセルされたとき」のイベントを、ViewControllerで受け取れるようにする。
そのために、ViewControllerをメディアアイテムピッカーのデリゲートとして設定する。
「選曲」ボタンを押すと、メディアアイテムピッカーを作成して、デリゲートの設定を行い、ライブラリの曲を選択できるようにする。
「選択完了したとき」「キャンセルされたとき」のメソッドを記述する。 ViewController.h スクリーンショット 2013-08-12 15.15.51 ViewController.m スクリーンショット 2013-08-12 16.21.34

各ボタンのアクションに、「再生」「一時停止」「停止」機能を加える。 スクリーンショット 2013-08-12 19.47.50

iOSシミュレータでは動作しません。実機を用いてください。 「選曲」ボタンを押すと、メディアアイテムピッカーが表示され、曲を選択すると音楽がスタートします。「再生」ボタンで音楽の再生。「一時停止」ボタンで一時停止。「停止」ボタンで音楽を止めて、再生位置を一番始めに戻します。
ViewController.h

//
//  ViewController.h
//  sampleMusicPlayer
//

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController : UIViewController<MPMediaPickerControllerDelegate>

@end

ViewController.m

//
//  ViewController.m
//  sampleMusicPlayer
//

#import "ViewController.h"

@interface ViewController ()
@property MPMusicPlayerController* player;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.player = [MPMusicPlayerController applicationMusicPlayer];
}

- (IBAction)pick:(id)sender {
    // MPMediaPickerControllerのインスタンスを作成
    MPMediaPickerController *picker = [[MPMediaPickerController alloc]init];
    // ピッカーのデリゲートを設定
    picker.delegate = self;
    // 複数選択を不可にする。(YESにすると、複数選択できる)
    picker.allowsPickingMultipleItems = NO;
    // ピッカーを表示する
    [self presentViewController:picker animated:YES completion:nil];
}

// メディアアイテムピッカーでアイテムを選択完了したときに呼び出される
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
    // 選択した曲情報がmediaItemCollectionに入っているので、これをplayerにセット。
    [self.player setQueueWithItemCollection:mediaItemCollection];
    // 再生開始
    [self.player play];
    // ピッカーを閉じ、破棄する
    [mediaPicker dismissViewControllerAnimated:YES completion:nil];
}

//選択がキャンセルされた場合に呼ばれる
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{
    // ピッカーを閉じ、破棄する
    [mediaPicker dismissViewControllerAnimated:YES completion:nil];
}

- (IBAction)pushPlay:(id)sender {
    [self.player play];
}
- (IBAction)pushPause:(id)sender {
    [self.player pause];
}
- (IBAction)pushStop:(id)sender {
    [self.player stop];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

関連記事

[iOS]AVPlayerを使う | nackpan Blog AVFoundationフレームワークのAVPlayerクラスを使って、ミュージックライブラリの楽曲を再生する。

[Objective-C]iOSで、リソースファイルから音楽を再生する

リソースファイルから音楽を再生。

「再生」「一時停止」「停止」ができればOK。生のオーディオデータを加工したりはしない。という条件ならば、AVFoundationフレームワークのAVAudioPlayerを用いると簡便。

まずは、SingleApplicationでプロジェクトを作成。プロジェクト名はSampleAVAudioPlayerにしてみた。
2013-08-08_01.0createProject
2013-08-08_01.1createProject

AVFoundationフレームワークを加える。
2013-08-08_02addFramework

ViewController.hにAVFoundationフレームワークをimportする。
2013-08-09_02.1importFramework

ボタンを配置。
2013-08-08_03layoutBtn

ボタンとViewController.m間に、Actionを作成してつなげる。
2013-08-08_05action

使用するオーディオファイルをプロジェクトに加える。
2013-08-08_06addSound

オーディオプレイヤーを現すpropertyをViewController.mに加える。
2013-08-08_07addProperty

オーディオプレイヤーにオーディオファイルをセットするコード。
2013-08-08_08viewdidload

各ボタンのアクションに、「再生」「一時停止」「停止」機能を加える。
2013-08-08_09btnActionCord

Playボタンを押すと、オーディオファイルの再生。Pauseボタンで一時停止。Stopボタンで停止し、オーディファイルの再生位置を冒頭に戻します。

手を加えたソースコードは以下のようになります。
ViewController.h

//
//  ViewController.h
//  sampleAVAudioPlayer

#import 
#import 

@interface ViewController : UIViewController

@end

ViewController.m

//
//  ViewController.m
//  sampleAVAudioPlayer

#import "ViewController.h"

@interface ViewController ()
@property AVAudioPlayer* player;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    // リソースファイルをAVAudioPlayerにセット。
    NSString *path = [[NSBundle mainBundle] pathForResource:@"testSound" ofType:@"mp3"];
    NSURL *url = [NSURL fileURLWithPath: path];
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL: url error:nil];
}

- (IBAction)pushPlay:(id)sender {
    if(!self.player.isPlaying){
        [self.player play];
    }
}
- (IBAction)pushPause:(id)sender {
    if(self.player.isPlaying){
        [self.player pause];
    }
}
- (IBAction)pushStop:(id)sender {
    if(self.player.isPlaying){
        [self.player stop];
        self.player.currentTime = 0.0;
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end