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

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

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

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

今回の変更内容は下記の通りです。

変更内容

  1. オーディオ再生終了時のデリゲートメソッドを指定出来るよう変更しました (初期化時にデリゲート使用有無を指定)
  2. オーディオのバックグラウンド再生をサポートしました

バックグラウンド再生するために必要な手順

info.plistファイルを編集

  1. info.plistファイルを Xcode左側のプロジェクトメニューから開く
  2. Keyに Required background modesを追加
  3. Item 0 の Valueを App plays audio に指定

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

ダウンロード

使用方法

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

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

再生

1
[_audioPlayer play];

停止

1
[_audioPlayer stop];

一時停止

1
[_audioPlayer pause];

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

1
2
3
4
_audioVolumeSlider = [_audioPlayer volumeControlSlider:self
                                                 point:CGPointMake(50, 150)
                                          defaultValue:0.5f
                                              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
33
34
35
36
37
38
39
40
41
42
43
44
#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.0f

@protocol DCAudioPlayerDelegate;

@interface DCAudioPlayer : AVAudioPlayer <AVAudioPlayerDelegate> {
    id<DCAudioPlayerDelegate> _ap_delegate;
}

#pragma mark - property
@property (nonatomic, assign)                 id<DCAudioPlayerDelegate> ap_delegate;
@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;

#pragma mark - public method
- (id)initWithAudio:(NSString *)fileName ext:(NSString *)ext isUseDelegate:(BOOL)isUseDelegate;
- (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

#pragma mark - delegate method
@protocol DCAudioPlayerDelegate <NSObject>
@optional
@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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#import "DCAudioPlayer.h"

@implementation DCAudioPlayer

@synthesize ap_delegate;

// 初期化
- (id)initWithAudio:(NSString *)fileName ext:(NSString *)ext isUseDelegate:(BOOL)isUseDelegate
{
    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];

        // バックグラウンド再生を許可
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
        [audioSession setActive:YES error:nil];

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

            // デリゲート指定
            if (isUseDelegate) {
                [_audioPlayer setDelegate:self];
            }

            // バッファを保持
            [_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 setCurrentTime:0];
            [_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 = AUDIO_MIN_VOLUME;
    audioVolumeSlider.maximumValue = AUDIO_MAX_VOLUME;
    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;
}

#pragma mark - AVAudioPlayerDelegate

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)successfully
{
    if (successfully) {
        // ここでデリゲートメソッドを指定する

    }
}

@end

お薦めの参考書

本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応
iOSアプリ開発をこれから始める方に最もお薦めな一冊です。解り辛い点は図解入りで解説されており、プログラミングの動作の仕組みから詳しく知ることができます。基本から通信処理まで押さえられており、アプリ公開の手順についても解説されています。

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

About

Masaki Hirokawa (@dolice_apps)

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

iPhone apps

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