音楽ファイルの再生停止などの制御をする「DCAudioPlayer」クラス

音楽ファイルの再生停止などの制御をする「DCAudioPlayer」クラスを作成しました。

オーディオの再生/停止/再生状況の取得、ボリュームコントロールスライダーの生成などを行えます。

このクラスの使用には AVFoundationフレームワークが必要になります。

下記よりサンプルとソースコードのダウンロードが行えます。

ダウンロード

使用方法

オーディオファイルを指定し初期化

1
2
_audioPlayer = [[DCAudioPlayer alloc] initWithAudio:AUDIO_RESOURCE_FILE_NAME
                                                ext:AUDIO_RESOURCE_FILE_EXT];

再生

1
[_audioPlayer play];

停止

1
[_audioPlayer stop];

一時停止

1
[_audioPlayer pause];

ボリュームコントロールスライダーの取得

1
2
3
4
_audioVolumeSlider = [_audioPlayer volumeControlSlider:self
                                                 point:CGPointMake(50, 150)
                                          defaultValue:0.2f
                                              selector:@selector(sliderValueChanged:)];
1
2
3
4
5
6
- (void)sliderValueChanged:(UISlider *)slider
{
    if (_audioPlayer) {
        [_audioPlayer setVolume:slider.value];
    }
}

音量の指定

1
[_audioPlayer setVolume:0.5f];

現在の再生フレームの指定

1
[_audioPlayer setCurrentTime:0];

再生ループ回数の指定

1
[_audioPlayer setNumberOfLoops:-1];

再生状況の取得

1
BOOL isPlaying = _audioPlayer.isPlaying;

ソースコード

DCAudioPlayer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#import <AVFoundation/AVFoundation.h>

#define AUDIO_VOLUME_SLIDER_WIDTH  220
#define AUDIO_VOLUME_SLIDER_HEIGHT 0
#define AUDIO_MAX_VOLUME           1.0f
#define AUDIO_MIN_VOLUME           0.5f

@interface DCAudioPlayer : AVAudioPlayer

@property AVAudioPlayer                       *audioPlayer;
@property NSTimeInterval                      currentTime;
@property (readonly) NSData                   *data;
@property (assign) id <AVAudioPlayerDelegate> delegate;
@property NSTimeInterval                      duration;
@property (getter=isMeteringEnabled) BOOL     meteringEnabled;
@property (readonly) NSUInteger               numberOfChannels;
@property NSInteger                           numberOfLoops;
@property (readonly, getter=isPlaying) BOOL   playing;
@property (readonly) NSURL                    *url;
@property float                               volume;

- (id)initWithAudio:(NSString *)fileName ext:(NSString *)ext;
- (void)play;
- (void)pause;
- (void)stop;
- (UISlider *)volumeControlSlider:(id)delegate point:(CGPoint)point defaultValue:(float)defaultValue selector:(SEL)selector;
- (void)setVolume:(float)volume;
- (void)setCurrentTime:(NSTimeInterval)currentTime;
- (void)setNumberOfLoops:(NSInteger)numberOfLoops;
- (BOOL)isPlaying;

@end

DCAudioPlayer.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#import "DCAudioPlayer.h"

@implementation DCAudioPlayer

//初期化
- (id)initWithAudio:(NSString *)fileName ext:(NSString *)ext
{
    if (self = [super init]) {
        //オーディオプレイヤー初期化
        NSBundle *mainBundle = [NSBundle mainBundle];
        NSString *filePath = [mainBundle pathForResource:fileName
                                                  ofType:ext];
        NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
        NSError *error = nil;
        AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];

        //エラーであれば処理しない
        if (!error) {
            //オーディオプレイヤー保持
            _audioPlayer = audioPlayer;

            //バッファを保持
            [_audioPlayer prepareToPlay];
        }
    }
    return self;
}

//再生
- (void)play
{
    if (_audioPlayer) {
        if (!_audioPlayer.isPlaying) {
            [_audioPlayer prepareToPlay];
            [_audioPlayer play];
        }
    }
}

//一時停止
- (void)pause
{
    if (_audioPlayer) {
        if (_audioPlayer.isPlaying) {
            [_audioPlayer pause];
        }
    }
}

//停止
- (void)stop
{
    if (_audioPlayer) {
        if (_audioPlayer.isPlaying) {
            [_audioPlayer stop];
            [_audioPlayer prepareToPlay];
        }
    }
}

//ボリュームコントロールスライダー
- (UISlider *)volumeControlSlider:(id)delegate point:(CGPoint)point defaultValue:(float)defaultValue selector:(SEL)selector
{
    UISlider *audioVolumeSlider = [[UISlider alloc] initWithFrame:CGRectMake(point.x,
                                                                             point.y,
                                                                             AUDIO_VOLUME_SLIDER_WIDTH,
                                                                             AUDIO_VOLUME_SLIDER_HEIGHT)];
    audioVolumeSlider.minimumValue = 0.0f;
    audioVolumeSlider.maximumValue = 1.0f;
    if (defaultValue > AUDIO_MAX_VOLUME) defaultValue = AUDIO_MAX_VOLUME;
    if (defaultValue < AUDIO_MIN_VOLUME) defaultValue = AUDIO_MIN_VOLUME;
    audioVolumeSlider.value = defaultValue;
    [audioVolumeSlider addTarget:delegate
                          action:selector
                forControlEvents:UIControlEventValueChanged];
    return audioVolumeSlider;
}

//ボリューム指定
- (void)setVolume:(float)volume
{
    if (_audioPlayer) {
        _audioPlayer.volume = volume;
    }
}

//現在の再生フレーム指定
- (void)setCurrentTime:(NSTimeInterval)currentTime
{
    if (_audioPlayer) {
        _audioPlayer.currentTime = currentTime;
    }
}

//ループ回数指定
- (void)setNumberOfLoops:(NSInteger)numberOfLoops
{
    if (_audioPlayer) {
        _audioPlayer.numberOfLoops = numberOfLoops;
    }
}

//再生状況の取得
- (BOOL)isPlaying
{
    return _audioPlayer.playing;
}

@end

サンプルソースコード

ViewController.h

1
2
3
4
5
6
7
8
9
10
11
#import <UIKit/UIKit.h>
#import "DCAudioPlayer.h"

#define AUDIO_RESOURCE_FILE_NAME @"o-magne"
#define AUDIO_RESOURCE_FILE_EXT  @"mp3"
#define BUTTON_WIDTH             80
#define BUTTON_HEIGHT            50

@interface ViewController : UIViewController

@end

ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#import "ViewController.h"

@interface ViewController ()

@property DCAudioPlayer *audioPlayer;
@property UISlider      *audioVolumeSlider;

@end

@implementation ViewController

typedef enum audioPlayButtonEvent : NSInteger {
    AUDIO_PLAY = 1,
    AUDIO_PAUSE = 2,
    AUDIO_STOP = 3
} audioPlayButtonEvent;

- (void)viewDidLoad
{
    [super viewDidLoad];

    //初期化
    _audioPlayer = [[DCAudioPlayer alloc] initWithAudio:AUDIO_RESOURCE_FILE_NAME
                                                    ext:AUDIO_RESOURCE_FILE_EXT];

    //再生/停止ボタンとボリュームスライダー表示
    [self setButtonsAndSlider];
}


//再生/停止ボタンイベント
- (void)buttonTapped:(UIButton *)button
{
    if (button.tag == AUDIO_PLAY) {
        //ボリューム指定
        [_audioPlayer setVolume:_audioVolumeSlider.value];

        //ループ回数指定
        [_audioPlayer setNumberOfLoops:-1];

        //再生
        [_audioPlayer play];
    } else if (button.tag == AUDIO_PAUSE) {
        if (_audioPlayer.isPlaying) {
            //一時停止
            [_audioPlayer pause];
        } else {
            //再生
            [_audioPlayer play];
        }
    } else if (button.tag == AUDIO_STOP) {
        //再生フレーム指定
        [_audioPlayer setCurrentTime:0];
        //停止
        [_audioPlayer stop];
    }
}

//再生/停止ボタンとボリュームスライダーの表示
- (void)setButtonsAndSlider
{
    //再生ボタン
    UIButton *buttonPlay = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    buttonPlay.frame = CGRectMake(20, 50, BUTTON_WIDTH, BUTTON_HEIGHT);
    buttonPlay.tag = AUDIO_PLAY;
    [buttonPlay setTitle:@"Play" forState:UIControlStateNormal];
    [buttonPlay addTarget:self
                   action:@selector(buttonTapped:)
         forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:buttonPlay];

    //一時停止ボタン
    UIButton *buttonPause = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    buttonPause.frame = CGRectMake(120, 50, BUTTON_WIDTH, BUTTON_HEIGHT);
    buttonPause.tag = AUDIO_PAUSE;
    [buttonPause setTitle:@"Pause" forState:UIControlStateNormal];
    [buttonPause addTarget:self
                    action:@selector(buttonTapped:)
          forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:buttonPause];

    //停止ボタン
    UIButton *buttonStop = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    buttonStop.frame = CGRectMake(220, 50, BUTTON_WIDTH, BUTTON_HEIGHT);
    buttonStop.tag = AUDIO_STOP;
    [buttonStop setTitle:@"Stop" forState:UIControlStateNormal];
    [buttonStop addTarget:self
                   action:@selector(buttonTapped:)
         forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:buttonStop];

    //ボリュームスライダー
    _audioVolumeSlider = [_audioPlayer volumeControlSlider:self
                                                     point:CGPointMake(50, 150)
                                              defaultValue:0.2f
                                                  selector:@selector(sliderValueChanged:)];
    [self.view addSubview:_audioVolumeSlider];
}

//オーディオボリューム変更
- (void)sliderValueChanged:(UISlider *)slider
{
    if (_audioPlayer) {
        [_audioPlayer setVolume:slider.value];
    }
}

@end

お薦めの参考書

Swiftポケットリファレンス
Swiftの基本的な使い方から、データ処理やネットワーク処理の応用まで、逆引き形式で調べられる良書です。サンプルコードも Webからダウンロード出来、とても便利です。内容としては中級者向けですが、手元にあれば安心の一冊です。

   このエントリーをはてなブックマークに追加

About

Masaki Hirokawa (@dolice_apps)

デザインエンジニア 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング(無料)
  • 望みが叶う!引き寄せの法則アプリ(無料)
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー(無料)
  • 綺麗な壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)
  • クールな壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(4) Adfurikun(2) AdMob(9) Android(10) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(44) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(101) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(21) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(1) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(222) PHP(1) Products(14) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)