Mercurial > libervia-desktop-kivy
annotate libervia/desktop_kivy/plugins/plugin_transfer_voice.py @ 499:f387992d8e37
plugins: new "call" plugin for A/V calls:
this is the base implementation for calls plugin, handling one2one calls.
For now, the interface is very basic, call is done by specifying the bare jid of the
destinee, then press the "call" button. Incoming calls are automatically accepted.
rel 424
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 04 Oct 2023 22:54:36 +0200 |
parents | b3cedbee561d |
children |
rev | line source |
---|---|
379 | 1 #!/usr/bin/env python3 |
2 | |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
493
b3cedbee561d
refactoring: rename `cagou` to `libervia.desktop_kivy` + update imports and names following backend changes
Goffi <goffi@goffi.org>
parents:
491
diff
changeset
|
4 #Libervia Desktop-Kivy |
461 | 5 # Copyright (C) 2016-2021 Jérôme Poisson (goffi@goffi.org) |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
493
b3cedbee561d
refactoring: rename `cagou` to `libervia.desktop_kivy` + update imports and names following backend changes
Goffi <goffi@goffi.org>
parents:
491
diff
changeset
|
21 from libervia.backend.core import log as logging |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 log = logging.getLogger(__name__) |
493
b3cedbee561d
refactoring: rename `cagou` to `libervia.desktop_kivy` + update imports and names following backend changes
Goffi <goffi@goffi.org>
parents:
491
diff
changeset
|
23 from libervia.backend.core.i18n import _ |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from kivy.uix.boxlayout import BoxLayout |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 import sys |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 import time |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from kivy.clock import Clock |
96
641678ddc26c
upload (voice): fixed crash on desktop
Goffi <goffi@goffi.org>
parents:
95
diff
changeset
|
28 from kivy import properties |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 if sys.platform == "android": |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from plyer import audio |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 PLUGIN_INFO = { |
312 | 34 "name": _("voice"), |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 "main": "VoiceRecorder", |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 "platforms": ["android"], |
312 | 37 "description": _("transmit a voice record"), |
38 "icon_medium": "{media}/icons/muchoslava/png/micro_off_50.png", | |
400
71f51198478c
android: handle runtime permissions:
Goffi <goffi@goffi.org>
parents:
379
diff
changeset
|
39 "android_permissons": ["RECORD_AUDIO"], |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 } |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 class VoiceRecorder(BoxLayout): |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 callback = properties.ObjectProperty() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 cancel_cb = properties.ObjectProperty() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 recording = properties.BooleanProperty(False) |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 playing = properties.BooleanProperty(False) |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 time = properties.NumericProperty(0) |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 def __init__(self, **kwargs): |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 super(VoiceRecorder, self).__init__(**kwargs) |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 self._started_at = None |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 self._counter_timer = None |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 self._play_timer = None |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 self.record_time = None |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 self.audio = audio |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 self.audio.file_path = "/sdcard/cagou_record.3gp" |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
59 def _update_timer(self, dt): |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 self.time = int(time.time() - self._started_at) |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
62 def switch_recording(self): |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 if self.playing: |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
64 self._stop_playing() |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 if self.recording: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 try: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 audio.stop() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 except Exception as e: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 # an exception can happen if record is pressed |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 # repeatedly in a short time (not a normal use) |
312 | 71 log.warning("Exception on stop: {}".format(e)) |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 self._counter_timer.cancel() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 self.time = self.time + 1 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 else: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 audio.start() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 self._started_at = time.time() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 self.time = 0 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
78 self._counter_timer = Clock.schedule_interval(self._update_timer, 1) |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 self.recording = not self.recording |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
82 def _stop_playing(self, __=None): |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 if self.record_time is None: |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
84 log.error("_stop_playing should no be called when record_time is None") |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 return |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 audio.stop() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 self.playing = False |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self.time = self.record_time |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 if self._counter_timer is not None: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 self._counter_timer.cancel() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
92 def play_record(self): |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 if self.recording: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 return |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 if self.playing: |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
96 self._stop_playing() |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 else: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 try: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 audio.play() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 except Exception as e: |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 # an exception can happen in the same situation |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 # as for audio.stop() above (i.e. bad record) |
312 | 103 log.warning("Exception on play: {}".format(e)) |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 self.time = 0 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 return |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 self.playing = True |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 self.record_time = self.time |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
109 Clock.schedule_once(self._stop_playing, self.time + 1) |
95
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 self._started_at = time.time() |
3e3c097b07b7
upload: added voice plugin (for Android)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 self.time = 0 |
491
203755bbe0fe
massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
112 self._counter_timer = Clock.schedule_interval(self._update_timer, 0.5) |