Sideband/sbapp/plyer/platforms/android/audio.py

109 lines
3.1 KiB
Python
Raw Normal View History

2024-06-02 10:31:58 -06:00
import time
import threading
2022-09-16 10:07:57 -06:00
from jnius import autoclass
from plyer.facades.audio import Audio
# Recorder Classes
MediaRecorder = autoclass('android.media.MediaRecorder')
AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')
# Player Classes
MediaPlayer = autoclass('android.media.MediaPlayer')
class AndroidAudio(Audio):
'''Audio for android.
For recording audio we use MediaRecorder Android class.
For playing audio we use MediaPlayer Android class.
'''
def __init__(self, file_path=None):
2024-06-02 10:31:58 -06:00
default_path = None
2022-09-16 10:07:57 -06:00
super().__init__(file_path or default_path)
self._recorder = None
self._player = None
2024-06-02 10:31:58 -06:00
self._check_thread = None
self._finished_callback = None
2024-06-02 17:53:54 -06:00
self._format = "opus"
2024-06-03 18:55:13 -06:00
self.is_playing = False
2024-06-02 10:31:58 -06:00
def _check_playback(self):
while self._player and self._player.isPlaying():
time.sleep(0.25)
2024-06-03 18:55:13 -06:00
self.is_playing = False
2024-06-02 10:31:58 -06:00
if self._finished_callback and callable(self._finished_callback):
self._check_thread = None
self._finished_callback(self)
2022-09-16 10:07:57 -06:00
def _start(self):
self._recorder = MediaRecorder()
2024-06-02 17:53:54 -06:00
if self._format == "aac":
self._recorder.setAudioSource(AudioSource.DEFAULT)
self._recorder.setAudioSamplingRate(48000)
2024-06-03 18:55:13 -06:00
self._recorder.setAudioEncodingBitRate(64000)
2024-06-02 17:53:54 -06:00
self._recorder.setAudioChannels(1)
self._recorder.setOutputFormat(OutputFormat.MPEG_4)
self._recorder.setAudioEncoder(AudioEncoder.AAC)
else:
self._recorder.setAudioSource(AudioSource.DEFAULT)
self._recorder.setAudioSamplingRate(48000)
2024-06-04 10:12:28 -06:00
self._recorder.setAudioEncodingBitRate(12000)
2024-06-02 17:53:54 -06:00
self._recorder.setAudioChannels(1)
self._recorder.setOutputFormat(OutputFormat.OGG)
self._recorder.setAudioEncoder(AudioEncoder.OPUS)
2022-09-16 10:07:57 -06:00
self._recorder.setOutputFile(self.file_path)
self._recorder.prepare()
self._recorder.start()
def _stop(self):
if self._recorder:
try:
self._recorder.stop()
self._recorder.release()
except Exception as e:
print("Could not stop recording: "+str(e))
2022-09-16 10:07:57 -06:00
self._recorder = None
if self._player:
try:
self._player.stop()
self._player.release()
except Exception as e:
print("Could not stop playback: "+str(e))
2022-09-16 10:07:57 -06:00
self._player = None
2024-06-03 18:55:13 -06:00
self.is_playing = False
2022-09-16 10:07:57 -06:00
def _play(self):
self._player = MediaPlayer()
self._player.setDataSource(self.file_path)
self._player.prepare()
self._player.start()
2024-06-03 18:55:13 -06:00
self.is_playing = True
2022-09-16 10:07:57 -06:00
2024-06-02 10:31:58 -06:00
self._check_thread = threading.Thread(target=self._check_playback, daemon=True)
self._check_thread.start()
def reload(self):
self._stop()
2024-06-02 10:31:58 -06:00
2024-06-03 18:55:13 -06:00
def playing(self):
return self.is_playing
2022-09-16 10:07:57 -06:00
def instance():
return AndroidAudio()