
音楽ファイルの再生停止などの制御をする「DCAudioPlayer」クラスを作成しました。
オーディオの再生/停止/再生状況の取得、ボリュームコントロールスライダーの生成などを行えます。
このクラスの使用には AVFoundationフレームワークが必要になります。
下記よりサンプルとソースコードのダウンロードが行えます。
ダウンロード
使用方法
オーディオファイルを指定し初期化
1
2
| _audioPlayer = [[DCAudioPlayer alloc] initWithAudio:AUDIO_RESOURCE_FILE_NAME
ext:AUDIO_RESOURCE_FILE_EXT];
|
再生
停止
一時停止
ボリュームコントロールスライダーの取得
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からダウンロード出来、とても便利です。内容としては中級者向けですが、手元にあれば安心の一冊です。