python-audio-autotest-3.10 1.5.12rc1__py3-none-any.whl → 1.6rc0__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 +211 -90
- 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.6rc0.dist-info}/METADATA +1 -1
- python_audio_autotest_3_10-1.6rc0.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.6rc0.dist-info}/WHEEL +0 -0
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.6rc0.dist-info}/licenses/LICENSE +0 -0
- {python_audio_autotest_3_10-1.5.12rc1.dist-info → python_audio_autotest_3_10-1.6rc0.dist-info}/top_level.txt +0 -0
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
|
pyaatlibs/logger.py
CHANGED
@@ -12,12 +12,15 @@ except ImportError:
|
|
12
12
|
import Queue as queue
|
13
13
|
import StringIO as sio
|
14
14
|
|
15
|
+
|
15
16
|
class LoggerThread(threading.Thread):
|
16
17
|
MAX_SIZE = 100000
|
17
18
|
BUF_SIZE = 10
|
18
19
|
LOG_DIR = ROOT_DIR + "{}{}{}".format(SEP, "{}log", SEP)
|
19
20
|
|
20
|
-
def __init__(
|
21
|
+
def __init__(
|
22
|
+
self, prefix="", logfolder_prefix="", max_size=MAX_SIZE, buf_size=BUF_SIZE, log_dir=LOG_DIR
|
23
|
+
):
|
21
24
|
super(LoggerThread, self).__init__()
|
22
25
|
self.daemon = True
|
23
26
|
self.msg_q = queue.Queue()
|
@@ -27,7 +30,9 @@ class LoggerThread(threading.Thread):
|
|
27
30
|
self.max_size = max_size
|
28
31
|
self.buf_size = buf_size
|
29
32
|
self.current_size = 0
|
30
|
-
self.log_dir = log_dir.format(
|
33
|
+
self.log_dir = log_dir.format(
|
34
|
+
"{}-".format(logfolder_prefix) if len(logfolder_prefix) > 0 else logfolder_prefix
|
35
|
+
)
|
31
36
|
self._to_stdout = False
|
32
37
|
self._to_file = False
|
33
38
|
|
@@ -45,7 +50,9 @@ class LoggerThread(threading.Thread):
|
|
45
50
|
def _update_timestamp(self):
|
46
51
|
t = datetime.datetime.now()
|
47
52
|
prefix = "{}-".format(self.prefix) if len(self.prefix) > 0 else ""
|
48
|
-
self.filename = "{}{}{:02d}{:02d}_{:02d}{:02d}{:02d}.log.txt".format(
|
53
|
+
self.filename = "{}{}{:02d}{:02d}_{:02d}{:02d}{:02d}.log.txt".format(
|
54
|
+
prefix, t.year, t.month, t.day, t.hour, t.minute, t.second
|
55
|
+
)
|
49
56
|
self.log_timestamp = t
|
50
57
|
|
51
58
|
def _dump(self):
|
@@ -61,6 +68,7 @@ class LoggerThread(threading.Thread):
|
|
61
68
|
def wait_for_queue_empty(self):
|
62
69
|
while not self.msg_q.empty():
|
63
70
|
import time
|
71
|
+
|
64
72
|
time.sleep(0.5)
|
65
73
|
|
66
74
|
def push(self, msg):
|
@@ -94,13 +102,13 @@ class LoggerThread(threading.Thread):
|
|
94
102
|
|
95
103
|
if self._to_stdout:
|
96
104
|
import sys
|
105
|
+
|
97
106
|
sys.stdout.write(logtext)
|
98
107
|
sys.stdout.flush()
|
99
108
|
|
100
109
|
self.current_size += 1
|
101
110
|
|
102
|
-
if self.current_size > 0 and
|
103
|
-
(self.current_size % self.buf_size == 0 or force_dump):
|
111
|
+
if self.current_size > 0 and (self.current_size % self.buf_size == 0 or force_dump):
|
104
112
|
self._dump()
|
105
113
|
|
106
114
|
if self.current_size >= self.max_size:
|
@@ -112,6 +120,7 @@ class LoggerThread(threading.Thread):
|
|
112
120
|
self._dump()
|
113
121
|
self.current_size = 0
|
114
122
|
|
123
|
+
|
115
124
|
class Logger(object):
|
116
125
|
WORK_THREAD = None
|
117
126
|
HAS_BEEN_INIT = False
|
@@ -131,11 +140,15 @@ class Logger(object):
|
|
131
140
|
BOTH_FILE_AND_STDOUT = STDOUT | FILE
|
132
141
|
|
133
142
|
@staticmethod
|
134
|
-
def init(
|
143
|
+
def init(
|
144
|
+
mode=Mode.BOTH_FILE_AND_STDOUT, prefix="", logfolder_prefix="", log_dir=LoggerThread.LOG_DIR
|
145
|
+
):
|
135
146
|
if Logger.HAS_BEEN_INIT:
|
136
147
|
return
|
137
148
|
|
138
|
-
Logger.WORK_THREAD = LoggerThread(
|
149
|
+
Logger.WORK_THREAD = LoggerThread(
|
150
|
+
prefix=prefix, logfolder_prefix=logfolder_prefix, log_dir=log_dir
|
151
|
+
)
|
139
152
|
|
140
153
|
if mode & Logger.Mode.STDOUT > 0:
|
141
154
|
Logger.WORK_THREAD.to_stdout()
|
@@ -162,7 +175,7 @@ class Logger(object):
|
|
162
175
|
@staticmethod
|
163
176
|
def log(tag=None, msg=None, level=Verbosity.NONE):
|
164
177
|
if not tag or not msg:
|
165
|
-
raise(ValueError("no tag or msg argument for Logger.log"))
|
178
|
+
raise (ValueError("no tag or msg argument for Logger.log"))
|
166
179
|
|
167
180
|
if Logger.VERBOSITY_LEVEL != Logger.Verbosity.NONE and level > Logger.VERBOSITY_LEVEL:
|
168
181
|
return
|
pyaatlibs/signalanalyzer.py
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
import numpy as np
|
2
2
|
|
3
|
+
|
3
4
|
def sort_values(signal):
|
4
5
|
signal = np.array(signal)
|
5
6
|
idices = np.argsort(signal, axis=0)
|
6
7
|
return zip(list(idices), list(signal[idices]))
|
7
8
|
|
9
|
+
|
8
10
|
def find_peaks(signal):
|
9
11
|
peaks = []
|
10
12
|
max_idx = np.argmax(signal)
|
11
|
-
peaks.append((max_idx, signal[max_idx]+1e-50))
|
13
|
+
peaks.append((max_idx, signal[max_idx] + 1e-50))
|
12
14
|
return peaks
|
pyaatlibs/signalmatcher.py
CHANGED
@@ -3,6 +3,7 @@ from librosa.core import load as audioload
|
|
3
3
|
from scipy.fftpack import fft
|
4
4
|
import matplotlib.pyplot as plt
|
5
5
|
|
6
|
+
|
6
7
|
class SignalMatcher(object):
|
7
8
|
FRAME_MILLIS_PER_FEATURE = 20
|
8
9
|
|
@@ -13,33 +14,37 @@ class SignalMatcher(object):
|
|
13
14
|
|
14
15
|
def _gen_feat(self):
|
15
16
|
sig_len = len(self.refsig)
|
16
|
-
framesize = int(np.round(self.reffs*SignalMatcher.FRAME_MILLIS_PER_FEATURE/1000.))
|
17
|
-
nfft = int(2**np.ceil(np.log2(framesize)))
|
18
|
-
self.feats = np.zeros([nfft/2, int(np.ceil(sig_len*1
|
17
|
+
framesize = int(np.round(self.reffs * SignalMatcher.FRAME_MILLIS_PER_FEATURE / 1000.0))
|
18
|
+
nfft = int(2 ** np.ceil(np.log2(framesize)))
|
19
|
+
self.feats = np.zeros([nfft / 2, int(np.ceil(sig_len * 1.0 / framesize))])
|
19
20
|
|
20
21
|
frame_sig = np.zeros([framesize])
|
21
22
|
for frame_idx in range(self.feats.shape[1]):
|
22
23
|
frame_sig[:] = 0
|
23
24
|
idx_from = frame_idx * framesize
|
24
25
|
idx_to = min([idx_from + framesize, sig_len])
|
25
|
-
frame_sig[:idx_to-idx_from] = self.refsig[idx_from:idx_to]
|
26
|
-
self.feats[:, frame_idx] = np.abs(fft(frame_sig, nfft))[:nfft/2]
|
26
|
+
frame_sig[: idx_to - idx_from] = self.refsig[idx_from:idx_to]
|
27
|
+
self.feats[:, frame_idx] = np.abs(fft(frame_sig, nfft))[: nfft / 2]
|
27
28
|
|
28
29
|
def visualize_feat(self, outpath):
|
29
30
|
feats = np.array(self.feats)
|
30
31
|
feats += 1e-32
|
31
32
|
feats = 20 * np.log10(feats)
|
32
|
-
plt.imshow(feats, vmax=np.max(feats), vmin=np.max(feats)-40, cmap="gray", origin="lower")
|
33
|
+
plt.imshow(feats, vmax=np.max(feats), vmin=np.max(feats) - 40, cmap="gray", origin="lower")
|
33
34
|
plt.colorbar()
|
34
35
|
|
35
|
-
ticks = plt.gca().get_yticks()*1.0/feats.shape[0] * self.reffs/2.0
|
36
|
+
ticks = plt.gca().get_yticks() * 1.0 / feats.shape[0] * self.reffs / 2.0
|
36
37
|
ticks = np.array(np.round(ticks), dtype=int)
|
37
38
|
plt.gca().set_yticklabels(ticks)
|
38
39
|
plt.gca().set_ylabel("frequency (Hz)")
|
39
|
-
plt.gca().set_xlabel(
|
40
|
+
plt.gca().set_xlabel(
|
41
|
+
"frame index ({} ms/frame)".format(SignalMatcher.FRAME_MILLIS_PER_FEATURE)
|
42
|
+
)
|
40
43
|
|
41
44
|
xlim = plt.gca().get_xlim()
|
42
|
-
plt.gcf().set_size_inches(
|
45
|
+
plt.gcf().set_size_inches(
|
46
|
+
[(xlim[1] - xlim[0]) * SignalMatcher.FRAME_MILLIS_PER_FEATURE / 1000.0, 3]
|
47
|
+
)
|
43
48
|
|
44
49
|
plt.savefig(outpath, bbox_inches="tight", pad_inches=0, dpi=300)
|
45
50
|
plt.gcf().clear()
|