【Swift】システムサウンドの再生方法!AudioServicesPlaySystemSoundの使い方
この記事からわかること
- Swiftのシステムサウンドの再生方法
- Audio Toolboxフレームワークとは?
- AudioServicesPlaySystemSoundメソッドの使い方
- バイブレーションの実装方法
- システムサウンドファイル一覧
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftで音を鳴らすにはサウンドファイルを用意し、AVAudioPlayerクラス
を使用して再生する方法と既存のシステムサウンドを鳴らす方法があります。今回は既存のシステムサウンドを鳴らす方法をまとめていきます。
システムサウンドとは?
iOSのシステムサウンドとは、デバイスがユーザーに対してフィードバックを提供するための音声エフェクトとしてデフォルトで用意されている機能のことです。着信音や通知音だけでなく、カメラのシャッター音、操作音などiOSデバイスを使用するにあたって基本的なサウンドのことを指します。
これらのサウンドファイルはデバイスの/System/Library/Audio/UISounds/
内に任意のファイル名(と識別子:SystemSoundID)がつけて保存されており、iOSアプリ開発者はAudio Toolbox
フレームワークを使用することでシステムサウンドを呼び出せるようになっています。
Audio Toolboxフレームワークとは?
公式リファレンス:Audio Toolbox Framework
Audio Toolboxフレークワークはオーディオの録音または再生、フォーマットの変換、オーディオストリームの解析、およびオーディオセッションの構成を行うためのAPIを提供するフレームワークです。
要するにサウンドやバイブレーションなどを操作できるフレームワークであり、その中にシステムサウンドを再生するためのメソッドが用意されています。
AVFoundationとの違いと使い分け
Swiftでは似たようなフレームワークにAVFoundation
フレームワークがあります。
おすすめ記事:【SwiftUI】AVAudioPlayerで音(サウンド)を鳴らす方法!
Audio ToolboxとAVFoundationは両方とも音声関連のAPIを提供するフレームワークです。
役割と違い
- Audio Toolbox:音声処理に特化
- AVFoundation:音声・動画関連の機能を網羅的に提供
Audio Toolbox
低レベルのオーディオデータの処理や、オーディオエフェクトの実装、オーディオ信号の加工・変換など、音声関連の機能を提供。しかし、音声関連以外の機能は提供されていない。
AVFoundation
音声・動画の再生、録音・録画、ストリーミング再生、メディアファイルの編集など、多彩な機能を提供。音声・動画の再生アプリや、動画編集アプリなどに最適。
AudioServicesPlaySystemSoundメソッド
公式リファレンス:AudioServicesPlaySystemSound method
func AudioServicesPlaySystemSound(_ inSystemSoundID: SystemSoundID)
AudioServicesPlaySystemSound
メソッドがシステムサウンドを再生するための関数です。引数には鳴らしたいサウンドのSystemSoundID
を渡す必要があります。
AudioServicesPlaySystemSoundメソッドの仕様
- 継続時間は30秒以内
- リニアPCMまたはIMA4(IMA/ADPCM)形式
- .caf、.aif、または.wavファイルにパッケージ化
- 現在のシステムオーディオボリュームで再生され、ボリュームコントロールは利用できない
- すぐにサウンドが再生される
- ループとステレオポジショニングは利用できない
- 一度に再生できる音は1つだけ
- サウンドはデバイスのスピーカーでローカルに再生され、オーディオルーティングは使用できない
システムサウンドの再生方法
とりあえずiOSアプリからシステムサウンドを再生する実装方法を見てみます。import AudioToolbox
を忘れないように記述します。
import SwiftUI
import AudioToolbox
struct AudioPlayerView: View {
var body: some View {
Button {
let soundIdBell:SystemSoundID = 1000
AudioServicesPlaySystemSound(soundIdBell)
} label: {
Text("再生")
}
}
}
鳴らす方法は簡単で上記のように鳴らしたいサウンドID(最後に一覧を載せておきました)を準備してAudioServicesPlaySystemSound
メソッドを呼び出すだけです。
この方法の場合は任意のサウンドファイルのサウンドとバイブレーションが再生されます。デバイスのサウンド設定によって変化するので色々試してみてください。ちなみにシミュレーターではバイブレーションの確認はできませんでした。
SystemSoundID型
引数として渡すSystemSoundID
型はUInt32
型のタイプエイリアスなのでそのまま数値で渡せばOKです。
typealias SystemSoundID = UInt32
おすすめ記事:【Swift UI】typealias(タイプエイリアス)の使い方とメリット
バイブレーションのみを鳴らす
公式リファレンス:Alert Sound Identifiers
バイブレーションのみを呼び出したい場合は引数にkSystemSoundID_Vibrate
を渡します。デバイスの設定にもよりますが確認したい場合は実機にビルドしてサイレントモードに切り替えて試してみてください。
おすすめ記事:【Xcode】実機のiPhoneに自作アプリをビルドする方法!
Button {
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
} label: {
Text("バイブレーション")
}
サウンドのみ鳴らす
バイブレーションは鳴らさずサウンドのみを鳴らしたい場合はAudioServicesCreateSystemSoundID
メソッドを使用します。鳴らしたいサウンドのファイルパスを明示的に指定し、引数に渡せばシステムサウンドオブジェクトを生成してくれます。
Button {
var soundIdBell:SystemSoundID = 0
let soundUrl = NSURL(fileURLWithPath :" /System/Library/Audio/UISounds/new-mail.caf")
AudioServicesCreateSystemSoundID(soundUrl, &soundIdBell)
AudioServicesPlaySystemSound(soundIdBell)
print(soundIdBell)
} label: {
Text("サウンドのみ")
}
iOSシステムサウンド一覧
指定できるサウンドシステムファイルのSound IDやファイル名は以下の通りです。ファイル名とカテゴリーからではどのような音か識別できない部分も多いので実際に鳴らして試してみてください。例えば1000
はベルのような音が流れます。
Sound ID | ファイル名(iPhone) | カテゴリー |
---|---|---|
1000 | new-mail.caf | メール受信 |
1001 | mail-sent.caf | メール送信 |
1002 | Voicemail.caf | 音声メール受信 |
1003 | ReceivedMessage.caf | SMS受信 |
1004 | SentMessage.caf | SMS送信 |
1005 | alarm.caf | カレンダーアラート |
1006 | low_power.caf | LowPower |
1007 | sms-received1.caf | SMS受信音 |
1008 | sms-received2.caf | SMS受信音 |
1009 | sms-received3.caf | SMS受信音 |
1010 | sms-received4.caf | SMS受信音 |
1011 | - | SMS受信バイブレート |
1012 | sms-received1.caf | SMS受信音 |
1013 | sms-received5.caf | SMS受信音 |
1014 | sms-received6.caf | SMS受信音 |
1015 | Voicemail.caf | - |
1016 | tweet_sent.caf | SMSSent |
1020 | Anticipate.caf | SMS受信音 |
1021 | Bloom.caf | SMS受信音 |
1022 | Calypso.caf | SMS受信音 |
1023 | Choo_Choo.caf | SMS受信音 |
1024 | Descent.caf | SMS受信音 |
1025 | Fanfare.caf | SMS受信音 |
1026 | Ladder.caf | SMS受信音 |
1027 | Minuet.caf | SMS受信音 |
1028 | News_Flash.caf | SMS受信音 |
1029 | Noir.caf | SMS受信音 |
1030 | Sherwood_Forest.caf | SMS受信音 |
1031 | Spell.caf | SMS受信音 |
1032 | Suspense.caf | SMS受信音 |
1033 | Telegraph.caf | SMS受信音 |
1034 | Tiptoes.caf | SMS受信音 |
1035 | Typewriters.caf | SMS受信音 |
1036 | Update.caf | SMS受信音 |
1050 | ussd.caf | USSDAlert |
1051 | SIMToolkitCallDropped.caf | SIMToolkitTone |
1052 | SIMToolkitGeneralBeep.caf | SIMToolkitTone |
1053 | SIMToolkitNegativeACK.caf | SIMToolkitTone |
1054 | SIMToolkitPositiveACK.caf | SIMToolkitTone |
1055 | SIMToolkitSMS.caf | SIMToolkitTone |
1057 | Tink.caf | PINキー操作 |
1070 | ct-busy.caf | AudioToneBusy |
1071 | ct-congestion.caf | AudioToneCongestion |
1072 | ct-path-ack.caf | AudioTonePathAcknowledge |
1073 | ct-error.caf | AudioToneError |
1074 | ct-call-waiting.caf | AudioToneCallWaiting |
1075 | ct-keytone2.caf | AudioToneKey2 |
1100 | lock.caf | ScreenLocked |
1101 | unlock.caf | ScreenUnlocked |
1102 | - | FailedUnlock |
1103 | Tink.caf | キー操作 |
1104 | Tock.caf | キー操作 |
1105 | Tock.caf | キー操作 |
1106 | beep-beep.caf | ConnectedToPower |
1107 | RingerChanged.caf | RingerSwitchIndication |
1108 | photoShutter.caf | シャッター音 |
1109 | shake.caf | シェイク音 |
1110 | jbl_begin.caf | JBL_Begin |
1111 | jbl_confirm.caf | JBL_Confirm |
1112 | jbl_cancel.caf | JBL_Cancel |
1113 | begin_record.caf | 録音開始 |
1114 | end_record.caf | 録音終了 |
1115 | jbl_ambiguous.caf | JBL_Ambiguous |
1116 | jbl_no_match.caf | JBL_NoMatch |
1117 | begin_video_record.caf | ビデオ録画開始 |
1118 | end_video_record.caf | ビデオ録画終了 |
1150 | vc~invitation-accepted.caf | VCInvitationAccepted |
1151 | vc~ringing.caf | VCRinging |
1152 | vc~ended.caf | VCEnded |
1153 | ct-call-waiting.caf | VCCallWaiting |
1154 | vc~ringing.caf | VCCallUpgrade |
1200 | dtmf-0.caf | TouchTone |
1201 | dtmf-1.caf | TouchTone |
1202 | dtmf-2.caf | TouchTone |
1203 | dtmf-3.caf | TouchTone |
1204 | dtmf-4.caf | TouchTone |
1205 | dtmf-5.caf | TouchTone |
1206 | dtmf-6.caf | TouchTone |
1207 | dtmf-7.caf | TouchTone |
1208 | dtmf-8.caf | TouchTone |
1209 | dtmf-9.caf | TouchTone |
1210 | dtmf-star.caf | TouchTone |
1211 | dtmf-pound.caf | TouchTone |
1254 | long_low_short_high.caf | Headset_StartCall |
1255 | short_double_high.caf | Headset_Redial |
1256 | short_low_high.caf | Headset_AnswerCall |
1257 | short_double_low.caf | Headset_EndCall |
1258 | short_double_low.caf | Headset_CallWaitingActions |
1259 | middle_9_short_double_low.caf | Headset_TransitionEnd |
1300 | Voicemail.caf | SystemSoundPreview |
1301 | ReceivedMessage.caf | SystemSoundPreview |
1302 | new-mail.caf | SystemSoundPreview |
1303 | mail-sent.caf | SystemSoundPreview |
1304 | alarm.caf | SystemSoundPreview |
1305 | lock.caf | SystemSoundPreview |
1306 | Tock.caf | KeyPressClickPreview |
1307 | sms-received1.caf | SMS受信選択 |
1308 | sms-received2.caf | SMS受信選択 |
1309 | sms-received3.caf | SMS受信選択 |
1310 | sms-received4.caf | SMS受信選択 |
1311 | - | SMS受信バイブレート |
1312 | sms-received1.caf | SMS受信選択 |
1313 | sms-received5.caf | SMS受信選択 |
1314 | sms-received6.caf | SMS受信選択 |
1315 | Voicemail.caf | SystemSoundPreview |
1320 | Anticipate.caf | SMS受信選択 |
1321 | Bloom.caf | SMS受信選択 |
1322 | Calypso.caf | SMS受信選択 |
1323 | Choo_Choo.caf | SMS受信選択 |
1324 | Descent.caf | SMS受信選択 |
1325 | Fanfare.caf | SMS受信選択 |
1326 | Ladder.caf | SMS受信選択 |
1327 | Minuet.caf | SMS受信選択 |
1328 | News_Flash.caf | SMS受信選択 |
1329 | Noir.caf | SMS受信選択 |
1330 | Sherwood_Forest.caf | SMS受信選択 |
1331 | Spell.caf | SMS受信選択 |
1332 | Suspense.caf | SMS受信選択 |
1333 | Telegraph.caf | SMS受信選択 |
1334 | Tiptoes.caf | SMS受信選択 |
1335 | Typewriters.caf | SMS受信選択 |
1336 | Update.caf | SMS受信選択 |
1350 | - | RingerVibeChanged |
1351 | - | SilentVibeChanged |
4095 | - | Vibrate |
参考文献: AudioServices-Predefined sounds
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。