-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAudioPlayerService.kt
More file actions
63 lines (55 loc) · 1.94 KB
/
Copy pathAudioPlayerService.kt
File metadata and controls
63 lines (55 loc) · 1.94 KB
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
package com.github.familyvault.services
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.usePinned
import platform.AVFAudio.AVAudioPlayer
import platform.AVFAudio.AVAudioPlayerDelegateProtocol
import platform.AVFAudio.AVAudioSession
import platform.AVFAudio.AVAudioSessionCategoryOptionDefaultToSpeaker
import platform.AVFAudio.AVAudioSessionCategoryPlayAndRecord
import platform.AVFAudio.setActive
import platform.Foundation.NSData
import platform.Foundation.dataWithBytes
import platform.darwin.NSObject
class AudioPlayerService : IAudioPlayerService {
private var audioPlayer: AVAudioPlayer? = null
private var listener: AudioPlayerListener? = null
@OptIn(ExperimentalForeignApi::class)
override fun play(audioData: ByteArray, onCompletion: (() -> Unit)?) {
prepareAudioSession()
audioPlayer = AVAudioPlayer(data = audioData.asData(), null)
audioPlayer?.prepareToPlay()
audioPlayer?.play()
listener = AudioPlayerListener {
onCompletion?.invoke()
}
audioPlayer?.delegate = listener
}
override fun stop() {
audioPlayer?.stop()
audioPlayer = null
listener = null
}
@OptIn(ExperimentalForeignApi::class)
private fun prepareAudioSession() {
AVAudioSession.sharedInstance().apply {
setCategory(
AVAudioSessionCategoryPlayAndRecord,
AVAudioSessionCategoryOptionDefaultToSpeaker,
null
)
setActive(true, null)
}
}
}
@OptIn(ExperimentalForeignApi::class)
fun ByteArray.asData(): NSData = usePinned {
NSData.dataWithBytes(it.addressOf(0), size.toULong())
}
class AudioPlayerListener(
private val didFinish: () -> Unit = {}
) : AVAudioPlayerDelegateProtocol, NSObject() {
override fun audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully: Boolean) {
didFinish()
}
}