python-audio-autotest-3.10 1.5.12rc1__py3-none-any.whl → 1.5.12rc3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyaatlibs/__init__.py +3 -2
- pyaatlibs/aatapp.py +92 -26
- pyaatlibs/activitystatemachine.py +4 -1
- pyaatlibs/adbutils.py +63 -35
- pyaatlibs/apk/audioworker.apk +0 -0
- pyaatlibs/appinterface.py +57 -22
- pyaatlibs/argutils.py +2 -0
- pyaatlibs/audiofunction.py +59 -27
- pyaatlibs/audiosignalframelogger.py +10 -9
- pyaatlibs/audiothread.py +32 -25
- pyaatlibs/audioworker.py +190 -87
- pyaatlibs/logcatlistener.py +19 -8
- pyaatlibs/logger.py +21 -8
- pyaatlibs/signalanalyzer.py +3 -1
- pyaatlibs/signalmatcher.py +14 -9
- pyaatlibs/tests/audioworker_test.py +168 -162
- pyaatlibs/timeutils.py +14 -5
- pyaatlibs/trials.py +9 -3
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.5.12rc3.dist-info}/METADATA +1 -1
- python_audio_autotest_3_10-1.5.12rc3.dist-info/RECORD +25 -0
- python_audio_autotest_3_10-1.5.12rc1.dist-info/RECORD +0 -25
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.5.12rc3.dist-info}/WHEEL +0 -0
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.5.12rc3.dist-info}/licenses/LICENSE +0 -0
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.5.12rc3.dist-info}/top_level.txt +0 -0
pyaatlibs/audioworker.py
CHANGED
@@ -10,6 +10,7 @@ from pyaatlibs.adbutils import Adb
|
|
10
10
|
from pyaatlibs.appinterface import AppInterface
|
11
11
|
from pyaatlibs.audiofunction import DetectionStateListener
|
12
12
|
|
13
|
+
|
13
14
|
# from Android SDK 32
|
14
15
|
class RecordInputSrc(IntEnum):
|
15
16
|
DEFAULT = 0
|
@@ -24,18 +25,21 @@ class RecordInputSrc(IntEnum):
|
|
24
25
|
UNPROCESSED = auto()
|
25
26
|
VOICE_PERFORMANCE = auto()
|
26
27
|
|
28
|
+
|
27
29
|
# align with audioworker
|
28
30
|
class RecordPerf(IntEnum):
|
29
31
|
NONE = 10
|
30
32
|
POWER_SAVING = auto()
|
31
33
|
LOW_LATENCY = auto()
|
32
34
|
|
35
|
+
|
33
36
|
# align with audioworker
|
34
37
|
class RecordApi(IntEnum):
|
35
38
|
NONE = 0
|
36
39
|
OPENSLES = auto()
|
37
40
|
AAUDIO = auto()
|
38
41
|
|
42
|
+
|
39
43
|
class PlaybackStream(IntEnum):
|
40
44
|
VOICE_CALL = 0
|
41
45
|
SYSTEM = auto()
|
@@ -46,6 +50,7 @@ class PlaybackStream(IntEnum):
|
|
46
50
|
DTMF = 8
|
47
51
|
ACCESSIBILITY = 10
|
48
52
|
|
53
|
+
|
49
54
|
class PlaybackContentType(IntEnum):
|
50
55
|
UNKNOWN = 0
|
51
56
|
SPEECH = auto()
|
@@ -54,6 +59,7 @@ class PlaybackContentType(IntEnum):
|
|
54
59
|
SONIFICATION = auto()
|
55
60
|
ULTRASOUND = 1997
|
56
61
|
|
62
|
+
|
57
63
|
class PlaybackUsage(IntEnum):
|
58
64
|
UNKNOWN = 0
|
59
65
|
MEDIA = auto()
|
@@ -69,20 +75,23 @@ class PlaybackUsage(IntEnum):
|
|
69
75
|
GAME = auto()
|
70
76
|
ASSISTANT = auto()
|
71
77
|
|
78
|
+
|
72
79
|
class PlaybackPerformanceMode(IntEnum):
|
73
80
|
NOT_SET = -1
|
74
81
|
NONE = auto()
|
75
82
|
LOW_LATENCY = auto()
|
76
83
|
POWER_SAVING = auto()
|
77
84
|
|
85
|
+
|
78
86
|
class TaskIndex(IntEnum):
|
79
87
|
ALL = -1
|
80
88
|
|
89
|
+
|
81
90
|
class AudioWorkerApp(AppInterface):
|
82
91
|
TAG = "AudioWorkerApp"
|
83
92
|
APK_PATHS = [
|
84
93
|
os.path.join(ROOT_DIR, "apk", "debug", "audioworker.apk"),
|
85
|
-
os.path.join(os.path.dirname(os.path.realpath(__file__)), "apk", "audioworker.apk")
|
94
|
+
os.path.join(os.path.dirname(os.path.realpath(__file__)), "apk", "audioworker.apk"),
|
86
95
|
]
|
87
96
|
INTENT_PREFIX = "am broadcast -a"
|
88
97
|
AUDIOWORKER_INTENT_PREFIX = "com.google.audioworker.intent."
|
@@ -100,11 +109,16 @@ class AudioWorkerApp(AppInterface):
|
|
100
109
|
if os.path.exists(path):
|
101
110
|
return path
|
102
111
|
|
103
|
-
raise(RuntimeError("no apk file is found."))
|
112
|
+
raise (RuntimeError("no apk file is found."))
|
104
113
|
|
105
114
|
@staticmethod
|
106
115
|
def get_apk_version():
|
107
|
-
|
116
|
+
out = subprocess.check_output(["strings", __class__.get_apk_path()], text=True)
|
117
|
+
for line in out.splitlines():
|
118
|
+
if "python-audio-autotest" not in line:
|
119
|
+
continue
|
120
|
+
return line.strip().replace("%", "")
|
121
|
+
return None
|
108
122
|
|
109
123
|
@staticmethod
|
110
124
|
def get_version_from_device(serialno=None):
|
@@ -114,16 +128,28 @@ class AudioWorkerApp(AppInterface):
|
|
114
128
|
|
115
129
|
out, _ = Adb.execute(
|
116
130
|
["shell", "dumpsys package com.google.audioworker | grep versionName"],
|
117
|
-
serialno=serialno
|
131
|
+
serialno=serialno,
|
132
|
+
)
|
133
|
+
|
134
|
+
version_from_device = out.strip().partition("versionName=")[-1]
|
135
|
+
version_from_apk = __class__.get_apk_version()
|
136
|
+
if version_from_device != version_from_apk:
|
137
|
+
__class__.log(
|
138
|
+
"get_version_from_device: the version got from package manager and from apk file"
|
139
|
+
f" don't match. (version_from_device: {version_from_device}, version_from_apk:"
|
140
|
+
f" {version_from_apk})"
|
141
|
+
)
|
118
142
|
|
119
|
-
return
|
143
|
+
return version_from_device
|
120
144
|
|
121
145
|
@classmethod
|
122
146
|
def install(child, grant=False, serialno=None, tolog=True):
|
123
147
|
super().install(grant=grant, serialno=serialno, tolog=tolog)
|
124
148
|
__class__.log(
|
125
149
|
"install: the installed version is '{}'".format(
|
126
|
-
__class__.get_version_from_device(serialno=serialno)
|
150
|
+
__class__.get_version_from_device(serialno=serialno)
|
151
|
+
)
|
152
|
+
)
|
127
153
|
|
128
154
|
@staticmethod
|
129
155
|
def get_launch_component():
|
@@ -148,7 +174,7 @@ class AudioWorkerApp(AppInterface):
|
|
148
174
|
ack_funcs = [
|
149
175
|
__class__.playback_info,
|
150
176
|
__class__.record_info,
|
151
|
-
__class__.voip_info
|
177
|
+
__class__.voip_info,
|
152
178
|
]
|
153
179
|
|
154
180
|
for func in ack_funcs:
|
@@ -179,16 +205,25 @@ class AudioWorkerApp(AppInterface):
|
|
179
205
|
cmd_arr += ["--es", key]
|
180
206
|
cmd_arr.append(str(value))
|
181
207
|
|
182
|
-
__class__.device_shell(
|
183
|
-
device=device, serialno=serialno, cmd=" ".join(cmd_arr), tolog=tolog)
|
208
|
+
__class__.device_shell(device=device, serialno=serialno, cmd=" ".join(cmd_arr), tolog=tolog)
|
184
209
|
|
185
210
|
@staticmethod
|
186
211
|
def playback_nonoffload(
|
187
|
-
device=None,
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
212
|
+
device=None,
|
213
|
+
serialno=None,
|
214
|
+
freqs=[440.0],
|
215
|
+
playback_id=0,
|
216
|
+
file="null",
|
217
|
+
stream_type=PlaybackStream.MUSIC,
|
218
|
+
performance_mode=PlaybackPerformanceMode.NOT_SET,
|
219
|
+
content_type=PlaybackContentType.MUSIC,
|
220
|
+
usage=PlaybackUsage.MEDIA,
|
221
|
+
fs=16000,
|
222
|
+
nch=2,
|
223
|
+
amp=0.6,
|
224
|
+
bit_depth=16,
|
225
|
+
low_latency_mode=False,
|
226
|
+
):
|
192
227
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "playback.start"
|
193
228
|
configs = {
|
194
229
|
"type": "non-offload",
|
@@ -203,7 +238,7 @@ class AudioWorkerApp(AppInterface):
|
|
203
238
|
"stream-type": stream_type,
|
204
239
|
"usage": usage,
|
205
240
|
"content-type": content_type,
|
206
|
-
"performance-mode": performance_mode
|
241
|
+
"performance-mode": performance_mode,
|
207
242
|
}
|
208
243
|
__class__.send_intent(device, serialno, name, configs)
|
209
244
|
|
@@ -213,15 +248,25 @@ class AudioWorkerApp(AppInterface):
|
|
213
248
|
configs = {
|
214
249
|
"type": "non-offload",
|
215
250
|
"playback-id": playback_id,
|
216
|
-
"seek-position-ms"
|
251
|
+
"seek-position-ms": seek_position_ms,
|
217
252
|
}
|
218
253
|
__class__.send_intent(device, serialno, name, configs)
|
219
254
|
|
220
255
|
@staticmethod
|
221
256
|
def playback_offload(
|
222
|
-
device=None,
|
223
|
-
|
224
|
-
|
257
|
+
device=None,
|
258
|
+
serialno=None,
|
259
|
+
file="null",
|
260
|
+
stream_type=PlaybackStream.MUSIC,
|
261
|
+
content_type=PlaybackContentType.MUSIC,
|
262
|
+
usage=PlaybackUsage.MEDIA,
|
263
|
+
freqs=[440.0],
|
264
|
+
playback_id=0,
|
265
|
+
fs=16000,
|
266
|
+
nch=2,
|
267
|
+
amp=0.6,
|
268
|
+
bit_depth=16,
|
269
|
+
):
|
225
270
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "playback.start"
|
226
271
|
configs = {
|
227
272
|
"type": "offload",
|
@@ -244,13 +289,19 @@ class AudioWorkerApp(AppInterface):
|
|
244
289
|
configs = {
|
245
290
|
"type": "offload",
|
246
291
|
"playback-id": playback_id,
|
247
|
-
"seek-position-ms"
|
292
|
+
"seek-position-ms": seek_position_ms,
|
248
293
|
}
|
249
294
|
__class__.send_intent(device, serialno, name, configs)
|
250
295
|
|
251
296
|
@staticmethod
|
252
297
|
def _common_info(
|
253
|
-
device=None,
|
298
|
+
device=None,
|
299
|
+
serialno=None,
|
300
|
+
ctype=None,
|
301
|
+
controller=None,
|
302
|
+
tolog=False,
|
303
|
+
extra_params={},
|
304
|
+
):
|
254
305
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "{}.info".format(ctype)
|
255
306
|
ts = datetime.datetime.timestamp(datetime.datetime.now())
|
256
307
|
ts = int(ts * 1000)
|
@@ -263,7 +314,8 @@ class AudioWorkerApp(AppInterface):
|
|
263
314
|
retry = 10
|
264
315
|
while retry > 0:
|
265
316
|
out, err = __class__.device_shell(
|
266
|
-
None, serialno, cmd="cat {}".format(filepath), tolog=tolog
|
317
|
+
None, serialno, cmd="cat {}".format(filepath), tolog=tolog
|
318
|
+
)
|
267
319
|
if len(out) == 0:
|
268
320
|
time.sleep(0.5)
|
269
321
|
retry -= 1
|
@@ -278,8 +330,9 @@ class AudioWorkerApp(AppInterface):
|
|
278
330
|
return {}
|
279
331
|
|
280
332
|
import traceback
|
333
|
+
|
281
334
|
try:
|
282
|
-
info_timestamp = float(out[0].strip().split("::")[-1]) / 1000.
|
335
|
+
info_timestamp = float(out[0].strip().split("::")[-1]) / 1000.0
|
283
336
|
info_t = datetime.datetime.fromtimestamp(info_timestamp)
|
284
337
|
# if (datetime.datetime.now() - info_t).total_seconds() > 1:
|
285
338
|
# return None
|
@@ -292,7 +345,8 @@ class AudioWorkerApp(AppInterface):
|
|
292
345
|
@staticmethod
|
293
346
|
def playback_info(device=None, serialno=None, tolog=False):
|
294
347
|
return __class__._common_info(
|
295
|
-
device, serialno, "playback", "PlaybackController", tolog=tolog
|
348
|
+
device, serialno, "playback", "PlaybackController", tolog=tolog
|
349
|
+
)
|
296
350
|
|
297
351
|
@staticmethod
|
298
352
|
def playback_stop(device=None, serialno=None, tolog=False):
|
@@ -303,18 +357,20 @@ class AudioWorkerApp(AppInterface):
|
|
303
357
|
|
304
358
|
for pbtype in info.keys():
|
305
359
|
for pbid in info[pbtype].keys():
|
306
|
-
configs = {
|
307
|
-
"type": pbtype,
|
308
|
-
"playback-id": int(pbid)
|
309
|
-
}
|
360
|
+
configs = {"type": pbtype, "playback-id": int(pbid)}
|
310
361
|
__class__.send_intent(device, serialno, name, configs)
|
311
362
|
|
312
363
|
@staticmethod
|
313
364
|
def record_info(device=None, serialno=None, task_index=TaskIndex.ALL, tolog=False):
|
314
365
|
task_index = int(task_index)
|
315
366
|
info = __class__._common_info(
|
316
|
-
device,
|
317
|
-
|
367
|
+
device,
|
368
|
+
serialno,
|
369
|
+
"record",
|
370
|
+
"RecordController",
|
371
|
+
extra_params={"task-index": task_index},
|
372
|
+
tolog=tolog,
|
373
|
+
)
|
318
374
|
if info == None:
|
319
375
|
return None
|
320
376
|
|
@@ -336,11 +392,7 @@ class AudioWorkerApp(AppInterface):
|
|
336
392
|
|
337
393
|
task_index = int(task_index)
|
338
394
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "{}.detect.register".format(prefix)
|
339
|
-
configs = {
|
340
|
-
"class": dclass,
|
341
|
-
"params": params,
|
342
|
-
"task-index": task_index
|
343
|
-
}
|
395
|
+
configs = {"class": dclass, "params": params, "task-index": task_index}
|
344
396
|
__class__.send_intent(device, serialno, name, configs)
|
345
397
|
|
346
398
|
@staticmethod
|
@@ -350,10 +402,7 @@ class AudioWorkerApp(AppInterface):
|
|
350
402
|
|
351
403
|
task_index = int(task_index)
|
352
404
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "{}.detect.unregister".format(prefix)
|
353
|
-
configs = {
|
354
|
-
"class-handle": chandle,
|
355
|
-
"task-index": task_index
|
356
|
-
}
|
405
|
+
configs = {"class-handle": chandle, "task-index": task_index}
|
357
406
|
__class__.send_intent(device, serialno, name, configs)
|
358
407
|
|
359
408
|
@staticmethod
|
@@ -377,17 +426,23 @@ class AudioWorkerApp(AppInterface):
|
|
377
426
|
|
378
427
|
task_index = int(task_index)
|
379
428
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "{}.detect.setparams".format(prefix)
|
380
|
-
configs = {
|
381
|
-
"class-handle": chandle,
|
382
|
-
"params": params,
|
383
|
-
"task-index": task_index
|
384
|
-
}
|
429
|
+
configs = {"class-handle": chandle, "params": params, "task-index": task_index}
|
385
430
|
__class__.send_intent(device, serialno, name, configs)
|
386
431
|
|
387
432
|
@staticmethod
|
388
433
|
def record_start(
|
389
|
-
device=None,
|
390
|
-
|
434
|
+
device=None,
|
435
|
+
serialno=None,
|
436
|
+
fs=16000,
|
437
|
+
nch=2,
|
438
|
+
bit_depth=16,
|
439
|
+
btsco_on=True,
|
440
|
+
perf=None,
|
441
|
+
input_src=None,
|
442
|
+
api=None,
|
443
|
+
dump_buffer_ms=1000,
|
444
|
+
task_index=0,
|
445
|
+
):
|
391
446
|
task_index = int(task_index)
|
392
447
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "record.start"
|
393
448
|
configs = {
|
@@ -399,7 +454,7 @@ class AudioWorkerApp(AppInterface):
|
|
399
454
|
"audio-perf": int(perf) if perf is not None else perf,
|
400
455
|
"audio-api": int(api) if api is not None else api,
|
401
456
|
"dump-buffer-ms": dump_buffer_ms,
|
402
|
-
"task-index"
|
457
|
+
"task-index": task_index,
|
403
458
|
}
|
404
459
|
__class__.send_intent(device, serialno, name, configs)
|
405
460
|
|
@@ -440,7 +495,8 @@ class AudioWorkerApp(AppInterface):
|
|
440
495
|
|
441
496
|
@staticmethod
|
442
497
|
def record_detector_set_params(
|
443
|
-
device=None, serialno=None, chandle=None, params={}, task_index=0
|
498
|
+
device=None, serialno=None, chandle=None, params={}, task_index=0
|
499
|
+
):
|
444
500
|
__class__.tx_detector_set_params("record", device, serialno, chandle, params, task_index)
|
445
501
|
|
446
502
|
@staticmethod
|
@@ -448,8 +504,21 @@ class AudioWorkerApp(AppInterface):
|
|
448
504
|
return __class__._common_info(device, serialno, "voip", "VoIPController", tolog=tolog)
|
449
505
|
|
450
506
|
@staticmethod
|
451
|
-
def voip_start(
|
452
|
-
|
507
|
+
def voip_start(
|
508
|
+
device=None,
|
509
|
+
serialno=None,
|
510
|
+
rxfreq=440.0,
|
511
|
+
rxamp=0.6,
|
512
|
+
rxspkr=False,
|
513
|
+
rxfile="null",
|
514
|
+
rxfs=8000,
|
515
|
+
txfs=8000,
|
516
|
+
rxnch=1,
|
517
|
+
txnch=1,
|
518
|
+
rxbit_depth=16,
|
519
|
+
txbit_depth=16,
|
520
|
+
dump_buffer_ms=0,
|
521
|
+
):
|
453
522
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "voip.start"
|
454
523
|
configs = {
|
455
524
|
"rx-target-freq": rxfreq,
|
@@ -462,7 +531,7 @@ class AudioWorkerApp(AppInterface):
|
|
462
531
|
"tx-sampling-freq": txfs,
|
463
532
|
"tx-num-channels": txnch,
|
464
533
|
"tx-pcm-bit-width": txbit_depth,
|
465
|
-
"tx-dump-buffer-ms": dump_buffer_ms
|
534
|
+
"tx-dump-buffer-ms": dump_buffer_ms,
|
466
535
|
}
|
467
536
|
__class__.send_intent(device, serialno, name, configs)
|
468
537
|
|
@@ -474,9 +543,7 @@ class AudioWorkerApp(AppInterface):
|
|
474
543
|
@staticmethod
|
475
544
|
def voip_use_speaker(device=None, serialno=None, use=True):
|
476
545
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "voip.config"
|
477
|
-
configs = {
|
478
|
-
"rx-use-spkr": use
|
479
|
-
}
|
546
|
+
configs = {"rx-use-spkr": use}
|
480
547
|
__class__.send_intent(device, serialno, name, configs)
|
481
548
|
|
482
549
|
@staticmethod
|
@@ -486,10 +553,7 @@ class AudioWorkerApp(AppInterface):
|
|
486
553
|
@staticmethod
|
487
554
|
def voip_change_configs(device=None, serialno=None, rxfreq=-1, rxamp=-1):
|
488
555
|
name = __class__.AUDIOWORKER_INTENT_PREFIX + "voip.config"
|
489
|
-
configs = {
|
490
|
-
"rx-target-freq": rxfreq,
|
491
|
-
"rx-amplitude": rxamp
|
492
|
-
}
|
556
|
+
configs = {"rx-target-freq": rxfreq, "rx-amplitude": rxamp}
|
493
557
|
__class__.send_intent(device, serialno, name, configs)
|
494
558
|
|
495
559
|
@staticmethod
|
@@ -532,13 +596,24 @@ from pyaatlibs.audiofunction import ToneDetectorThread, ToneDetector
|
|
532
596
|
from pyaatlibs.aatapp import AATAppToneDetectorThread
|
533
597
|
from pyaatlibs.logger import Logger
|
534
598
|
|
599
|
+
|
535
600
|
class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
601
|
+
|
602
|
+
def __init__(
|
603
|
+
self,
|
604
|
+
serialno,
|
605
|
+
target_freq,
|
606
|
+
detector_reg_func,
|
607
|
+
detector_unreg_func,
|
608
|
+
detector_setparams_func,
|
609
|
+
info_func,
|
610
|
+
parse_detector_func,
|
611
|
+
callback=None,
|
612
|
+
listener=None,
|
613
|
+
):
|
540
614
|
super(AudioWorkerToneDetectorThread, self).__init__(
|
541
|
-
serialno=serialno, target_freq=target_freq, callback=callback
|
615
|
+
serialno=serialno, target_freq=target_freq, callback=callback
|
616
|
+
)
|
542
617
|
self.serialno = serialno
|
543
618
|
self.chandle = None
|
544
619
|
self.listener = listener
|
@@ -547,8 +622,11 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
547
622
|
self.detector_setparams_func = detector_setparams_func
|
548
623
|
self.info_func = info_func
|
549
624
|
self.parse_detector_func = parse_detector_func
|
550
|
-
self.detector_reg_func(
|
551
|
-
|
625
|
+
self.detector_reg_func(
|
626
|
+
serialno=serialno,
|
627
|
+
dclass="ToneDetector",
|
628
|
+
params={"target-freq": [target_freq]},
|
629
|
+
)
|
552
630
|
|
553
631
|
def get_tag(self):
|
554
632
|
return "AudioWorkerToneDetectorThread"
|
@@ -653,7 +731,9 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
653
731
|
info = self.info_func(serialno=self.serialno)
|
654
732
|
if not info:
|
655
733
|
Logger.log(
|
656
|
-
"{}::get_info".format(self.get_tag()),
|
734
|
+
"{}::get_info".format(self.get_tag()),
|
735
|
+
"no active record, null info returned",
|
736
|
+
)
|
657
737
|
return
|
658
738
|
|
659
739
|
detectors = self.parse_detector_func(info)
|
@@ -666,7 +746,8 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
666
746
|
if chandle:
|
667
747
|
Logger.log(
|
668
748
|
"{}::get_info".format(self.get_tag()),
|
669
|
-
"found detector handle: {} for target {} Hz".format(chandle, self.target_freq)
|
749
|
+
"found detector handle: {} for target {} Hz".format(chandle, self.target_freq),
|
750
|
+
)
|
670
751
|
|
671
752
|
if not chandle:
|
672
753
|
Logger.log("{}::get_info".format(self.get_tag()), "no detector handle!")
|
@@ -680,14 +761,22 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
680
761
|
return
|
681
762
|
|
682
763
|
self.detector_setparams_func(
|
683
|
-
serialno=self.serialno,
|
684
|
-
|
764
|
+
serialno=self.serialno,
|
765
|
+
chandle=self.chandle,
|
766
|
+
params={"dump-history": str(enable).lower()},
|
767
|
+
)
|
685
768
|
|
686
769
|
def set_target_frequency(self, target_freq):
|
687
770
|
self.target_freq = target_freq
|
688
771
|
self.detector_setparams_func(
|
689
|
-
serialno=self.serialno,
|
690
|
-
|
772
|
+
serialno=self.serialno,
|
773
|
+
chandle=self.chandle,
|
774
|
+
params={
|
775
|
+
"target-freq": [target_freq],
|
776
|
+
"clear-target": "false",
|
777
|
+
"dump-history": "true",
|
778
|
+
},
|
779
|
+
)
|
691
780
|
self.shared_vars["msg"] = None
|
692
781
|
|
693
782
|
def run(self):
|
@@ -697,7 +786,7 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
697
786
|
"last_state": None,
|
698
787
|
"msg": None,
|
699
788
|
"tictoc": TicToc(),
|
700
|
-
"state_keep_ms": 0
|
789
|
+
"state_keep_ms": 0,
|
701
790
|
}
|
702
791
|
|
703
792
|
self.extra = {}
|
@@ -711,15 +800,14 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
711
800
|
def freq_cb(msg):
|
712
801
|
line = msg.splitlines()[0].strip()
|
713
802
|
strs = line.split()
|
714
|
-
t = datetime.datetime.fromtimestamp(float(strs[0][:-1]) / 1000.)
|
803
|
+
t = datetime.datetime.fromtimestamp(float(strs[0][:-1]) / 1000.0)
|
715
804
|
freq = float(strs[1])
|
716
805
|
|
717
806
|
if not self.target_detected(freq):
|
718
|
-
self.push_to_dump(
|
719
|
-
"the frequency {} Hz is not the target".format(freq))
|
807
|
+
self.push_to_dump("the frequency {} Hz is not the target".format(freq))
|
720
808
|
return
|
721
809
|
|
722
|
-
active =
|
810
|
+
active = strs[2].lower() == "active"
|
723
811
|
|
724
812
|
if not self.shared_vars["start_time"]:
|
725
813
|
self.shared_vars["start_time"] = t
|
@@ -727,7 +815,9 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
727
815
|
if active != self.shared_vars["last_state"]:
|
728
816
|
self.push_to_dump(
|
729
817
|
"the detection state has been changed from {} to {}".format(
|
730
|
-
self.shared_vars["last_state"], active
|
818
|
+
self.shared_vars["last_state"], active
|
819
|
+
)
|
820
|
+
)
|
731
821
|
self.shared_vars["last_state"] = active
|
732
822
|
self.shared_vars["start_time"] = t
|
733
823
|
self.shared_vars["tictoc"].toc()
|
@@ -738,14 +828,19 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
738
828
|
|
739
829
|
self.shared_vars["state_keep_ms"] += self.shared_vars["tictoc"].toc()
|
740
830
|
if self.shared_vars["state_keep_ms"] > 200:
|
741
|
-
event =
|
831
|
+
event = (
|
742
832
|
ToneDetector.Event.TONE_DETECTED if active else ToneDetector.Event.TONE_MISSING
|
833
|
+
)
|
743
834
|
if self.shared_vars["last_event"] != event:
|
744
835
|
self.shared_vars["last_event"] = event
|
745
|
-
Logger.log(
|
836
|
+
Logger.log(
|
837
|
+
self.get_tag(),
|
746
838
|
"send_cb({}, {}) on {} Hz".format(
|
747
|
-
t_str,
|
748
|
-
else "TONE_MISSING",
|
839
|
+
t_str,
|
840
|
+
"TONE_DETECTED" if active else "TONE_MISSING",
|
841
|
+
self.target_freq,
|
842
|
+
),
|
843
|
+
)
|
749
844
|
if self.cb != None:
|
750
845
|
self.cb((t_str, event))
|
751
846
|
if isinstance(self.listener, DetectionStateListener):
|
@@ -763,15 +858,20 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
763
858
|
|
764
859
|
adb_tictoc.tic()
|
765
860
|
msg_in_device, _ = Adb.execute(
|
766
|
-
cmd=[
|
767
|
-
"
|
768
|
-
|
861
|
+
cmd=[
|
862
|
+
"shell",
|
863
|
+
"cat {}/{}.txt".format(AudioWorkerApp.DATA_FOLDER, self.chandle),
|
864
|
+
],
|
865
|
+
serialno=self.serialno,
|
866
|
+
tolog=False,
|
867
|
+
)
|
769
868
|
elapsed = adb_tictoc.toc()
|
770
869
|
|
771
870
|
msg_in_device = map(lambda x: x.strip(), msg_in_device.splitlines())
|
772
871
|
msg_in_device = [x for x in msg_in_device if self.target_detected(float(x.split()[1]))]
|
773
|
-
self.shared_vars["msg"] =
|
872
|
+
self.shared_vars["msg"] = (
|
774
873
|
msg_in_device[-1] if len(msg_in_device) > 0 else self.shared_vars["msg"]
|
874
|
+
)
|
775
875
|
|
776
876
|
if elapsed > self.extra["adb-read-prop-max-elapsed"]:
|
777
877
|
self.extra["adb-read-prop-max-elapsed"] = elapsed
|
@@ -779,11 +879,14 @@ class AudioWorkerToneDetectorThread(AATAppToneDetectorThread):
|
|
779
879
|
if self.shared_vars["msg"]:
|
780
880
|
try:
|
781
881
|
self.push_to_dump(
|
782
|
-
"{} (adb-shell elapsed: {} ms)".format(self.shared_vars["msg"], elapsed)
|
882
|
+
"{} (adb-shell elapsed: {} ms)".format(self.shared_vars["msg"], elapsed)
|
883
|
+
)
|
783
884
|
freq_cb(self.shared_vars["msg"])
|
784
885
|
except Exception as e:
|
785
886
|
Logger.log(
|
786
|
-
self.get_tag(),
|
887
|
+
self.get_tag(),
|
888
|
+
"crashed in freq_cb('{}')".format(self.shared_vars["msg"]),
|
889
|
+
)
|
787
890
|
Logger.log(self.get_tag(), str(e))
|
788
891
|
|
789
892
|
elapsed = freq_cb_tictoc.toc()
|
pyaatlibs/logcatlistener.py
CHANGED
@@ -14,7 +14,9 @@ try:
|
|
14
14
|
except ImportError:
|
15
15
|
import Queue as queue
|
16
16
|
|
17
|
+
|
17
18
|
class LogcatOutputThread(threading.Thread):
|
19
|
+
|
18
20
|
def __init__(self, serialno, buffername):
|
19
21
|
super(LogcatOutputThread, self).__init__()
|
20
22
|
self.serialno = serialno
|
@@ -44,9 +46,12 @@ class LogcatOutputThread(threading.Thread):
|
|
44
46
|
preexec_fn = None if platform.system() == "Windows" else os.setsid
|
45
47
|
cmd = ["adb", "-s", self.serialno, "logcat"]
|
46
48
|
cmd = cmd + ["-b", self.buffername] if self.buffername else cmd
|
47
|
-
Logger.log(
|
48
|
-
|
49
|
-
|
49
|
+
Logger.log(
|
50
|
+
"LogcatOutputThread", "threadloop is listening with the command '{}'".format(cmd)
|
51
|
+
)
|
52
|
+
self.proc = subprocess.Popen(
|
53
|
+
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=preexec_fn
|
54
|
+
)
|
50
55
|
while not self.stoprequest.isSet():
|
51
56
|
if self.proc.poll() != None:
|
52
57
|
break
|
@@ -56,9 +61,9 @@ class LogcatOutputThread(threading.Thread):
|
|
56
61
|
if sys.version_info.major > 2:
|
57
62
|
line = line.decode("utf-8", errors="ignore")
|
58
63
|
|
59
|
-
if not self.lasttime_update_timer.is_alive():
|
64
|
+
if not self.lasttime_update_timer.is_alive(): # start for the first time
|
60
65
|
self.lasttime_update_timer.start()
|
61
|
-
else:
|
66
|
+
else: # reset for the followings
|
62
67
|
self.lasttime_update_timer.reset()
|
63
68
|
self._handle_logcat_msg(line)
|
64
69
|
|
@@ -74,11 +79,14 @@ class LogcatOutputThread(threading.Thread):
|
|
74
79
|
if pattern in msg:
|
75
80
|
self.listeners[pattern].cb(pattern=pattern, msg=msg)
|
76
81
|
|
82
|
+
|
77
83
|
class LogcatEvent(object):
|
84
|
+
|
78
85
|
def __init__(self, pattern=None, cb=None):
|
79
86
|
self.pattern = pattern
|
80
87
|
self.cb = cb
|
81
88
|
|
89
|
+
|
82
90
|
class LogcatListener(object):
|
83
91
|
WORK_THREADS = {}
|
84
92
|
|
@@ -88,8 +96,10 @@ class LogcatListener(object):
|
|
88
96
|
|
89
97
|
for threadname, th in LogcatListener.WORK_THREADS.items():
|
90
98
|
Logger.log("LogcatListener::dump", "thread[{}]".format(threadname))
|
91
|
-
Logger.log(
|
92
|
-
"
|
99
|
+
Logger.log(
|
100
|
+
"LogcatListener::dump",
|
101
|
+
" - Last time processing: {} ms ago".format(th.lasttime_update_timer.get_time()),
|
102
|
+
)
|
93
103
|
for event_pattern in th.listeners.keys():
|
94
104
|
Logger.log("LogcatListener::dump", " - pattern '{}'".format(event_pattern))
|
95
105
|
|
@@ -119,7 +129,8 @@ class LogcatListener(object):
|
|
119
129
|
threadname = "{}-{}".format(serialno, buffername)
|
120
130
|
if threadname in LogcatListener.WORK_THREADS.keys():
|
121
131
|
Logger.log(
|
122
|
-
"LogcatListener", "there is an existing running thread ({}).".format(threadname)
|
132
|
+
"LogcatListener", "there is an existing running thread ({}).".format(threadname)
|
133
|
+
)
|
123
134
|
if not flush:
|
124
135
|
Logger.log("LogcatListener", "skip the initialization.")
|
125
136
|
return
|