|
43 | 43 | (testing "transform with audio frame" |
44 | 44 | (let [state {::sut/speaking? false ::sut/sending-interval 25} |
45 | 45 | frame (frame/audio-output-raw {:audio (byte-array [1 2 3]) :sample-rate 16000}) |
46 | | - [new-state output] (sut/realtime-out-transform state :in frame)] |
| 46 | + [new-state output] (sut/base-realtime-out-transform state :in frame)] |
47 | 47 |
|
48 | 48 | (is (true? (::sut/speaking? new-state))) |
49 | 49 | (is (= 1 (count (:sys-out output)))) |
|
55 | 55 | ::sut/last-send-time 1000 |
56 | 56 | ::sut/silence-threshold 200} |
57 | 57 | timer-frame {:timer/tick true :timer/timestamp 1300} |
58 | | - [new-state output] (sut/realtime-out-transform state :timer-out timer-frame)] |
| 58 | + [new-state output] (sut/base-realtime-out-transform state :timer-out timer-frame)] |
59 | 59 |
|
60 | 60 | (is (false? (::sut/speaking? new-state))) |
61 | 61 | (is (= 1 (count (:sys-out output)))) |
|
84 | 84 | ::sut/last-send-time 1000 |
85 | 85 | ::sut/silence-threshold 200} |
86 | 86 | timer-frame {:timer/tick true :timer/timestamp 1500} |
87 | | - [new-state output] (sut/realtime-out-transform state :timer-out timer-frame)] |
| 87 | + [new-state output] (sut/base-realtime-out-transform state :timer-out timer-frame)] |
88 | 88 |
|
89 | 89 | (is (false? (::sut/speaking? new-state))) |
90 | 90 | (is (empty? (:out output))))) |
|
94 | 94 | ::sut/last-send-time 1000 |
95 | 95 | ::sut/silence-threshold 200} |
96 | 96 | timer-frame {:timer/tick true :timer/timestamp 1100} ; Only 100ms silence |
97 | | - [new-state output] (sut/realtime-out-transform state :timer-out timer-frame)] |
| 97 | + [new-state output] (sut/base-realtime-out-transform state :timer-out timer-frame)] |
98 | 98 |
|
99 | 99 | (is (true? (::sut/speaking? new-state))) |
100 | 100 | (is (empty? (:out output))))) |
|
104 | 104 | ::sut/last-send-time 1000 |
105 | 105 | ::sut/silence-threshold 200} |
106 | 106 | timer-frame {:timer/tick true :timer/timestamp 1300} ; 300ms silence > 200ms threshold |
107 | | - [new-state output] (sut/realtime-out-transform state :timer-out timer-frame)] |
| 107 | + [new-state output] (sut/base-realtime-out-transform state :timer-out timer-frame)] |
108 | 108 |
|
109 | 109 | (is (false? (::sut/speaking? new-state))) |
110 | 110 | (is (= 1 (count (:sys-out output)))) |
|
116 | 116 | (serialize-frame [_ frame] (assoc frame :serialized? true))) |
117 | 117 | config-frame (frame/system-config-change {:transport/serializer new-serializer}) |
118 | 118 | initial-state {:transport/serializer nil} |
119 | | - [new-state output] (sut/realtime-out-transform initial-state :in config-frame)] |
| 119 | + [new-state output] (sut/base-realtime-out-transform initial-state :in config-frame)] |
120 | 120 |
|
121 | 121 | (is (= new-serializer (:transport/serializer new-state))) |
122 | 122 | (is (empty? output)))) |
123 | 123 |
|
124 | 124 | (testing "system config change without serializer" |
125 | 125 | (let [config-frame (frame/system-config-change {:other/setting "value"}) |
126 | 126 | initial-state {:transport/serializer nil} |
127 | | - [new-state output] (sut/realtime-out-transform initial-state :in config-frame)] |
| 127 | + [new-state output] (sut/base-realtime-out-transform initial-state :in config-frame)] |
128 | 128 |
|
129 | 129 | (is (= initial-state new-state)) |
130 | 130 | (is (empty? output))))) |
|
141 | 141 | :transport/serializer mock-serializer} |
142 | 142 | frame (frame/audio-output-raw {:audio (byte-array [1 2 3]) :sample-rate 16000})] |
143 | 143 | (with-redefs [u/mono-time (constantly 1000)] |
144 | | - (let [[_ output] (sut/realtime-out-transform state :in frame) |
| 144 | + (let [[_ output] (sut/base-realtime-out-transform state :in frame) |
145 | 145 | audio-write (first (:audio-write output))] |
146 | 146 | (is (= :write-audio (:command audio-write))) |
147 | 147 | (is (= [99 99 99] (:frame/data (:data audio-write)))))))) ; Should use serialized data |
|
153 | 153 | :transport/serializer nil} |
154 | 154 | frame (frame/audio-output-raw {:audio (byte-array [1 2 3]) :sample-rate 16000})] |
155 | 155 | (with-redefs [u/mono-time (constantly 1000)] |
156 | | - (let [[_ output] (sut/realtime-out-transform state :in frame) |
| 156 | + (let [[_ output] (sut/base-realtime-out-transform state :in frame) |
157 | 157 | audio-write (first (:audio-write output))] |
158 | 158 | (is (= :write-audio (:command audio-write))) |
159 | 159 | (is (= [1 2 3] (vec (:data audio-write))))))))) |
|
162 | 162 | (testing "unknown input port" |
163 | 163 | (let [state {} |
164 | 164 | frame {:some :data} |
165 | | - [new-state output] (sut/realtime-out-transform state :unknown-port frame)] |
| 165 | + [new-state output] (sut/base-realtime-out-transform state :unknown-port frame)] |
166 | 166 |
|
167 | 167 | (is (= state new-state)) |
168 | 168 | (is (empty? output)))) |
169 | 169 |
|
170 | 170 | (testing "non-audio frame on input port" |
171 | 171 | (let [state {} |
172 | 172 | non-audio-frame {:frame/type :other} |
173 | | - [new-state output] (sut/realtime-out-transform state :in non-audio-frame)] |
| 173 | + [new-state output] (sut/base-realtime-out-transform state :in non-audio-frame)] |
174 | 174 |
|
175 | 175 | (is (= state new-state)) |
176 | 176 | (is (empty? output)))) |
177 | 177 |
|
178 | 178 | (testing "non-timer frame on timer-out port" |
179 | 179 | (let [state {} |
180 | 180 | non-timer-frame {:other :data} |
181 | | - [new-state output] (sut/realtime-out-transform state :timer-out non-timer-frame)] |
| 181 | + [new-state output] (sut/base-realtime-out-transform state :timer-out non-timer-frame)] |
182 | 182 |
|
183 | 183 | (is (= state new-state)) |
184 | 184 | (is (empty? output))))) |
|
201 | 201 | input-port :in |
202 | 202 | frame {:test :frame} |
203 | 203 | multi-arity-result (sut/realtime-speakers-out-fn state input-port frame) |
204 | | - direct-result (sut/realtime-out-transform state input-port frame)] |
| 204 | + direct-result (sut/base-realtime-out-transform state input-port frame)] |
205 | 205 | (is (= multi-arity-result direct-result))))) |
206 | 206 |
|
207 | 207 | (deftest test-realtime-out-state-transitions |
|
215 | 215 | (with-redefs [u/mono-time (let [counter (atom 0)] |
216 | 216 | #(swap! counter + 100))] ; Increment by 100ms each call |
217 | 217 | (let [;; Process first frame (should start speaking) |
218 | | - [state1 output1] (sut/realtime-out-transform initial-state :in frame1) |
| 218 | + [state1 output1] (sut/base-realtime-out-transform initial-state :in frame1) |
219 | 219 |
|
220 | 220 | ;; Process second frame (should continue speaking) |
221 | | - [state2 output2] (sut/realtime-out-transform state1 :in frame2) |
| 221 | + [state2 output2] (sut/base-realtime-out-transform state1 :in frame2) |
222 | 222 |
|
223 | 223 | ;; Process timer tick after silence threshold |
224 | 224 | timer-frame {:timer/tick true |
225 | 225 | :timer/timestamp (+ (::sut/last-send-time state2) 1000)} |
226 | | - [state3 output3] (sut/realtime-out-transform |
227 | | - (assoc state2 ::sut/silence-threshold 500) |
228 | | - :timer-out timer-frame)] |
| 226 | + [state3 output3] (sut/base-realtime-out-transform |
| 227 | + (assoc state2 ::sut/silence-threshold 500) |
| 228 | + :timer-out timer-frame)] |
229 | 229 |
|
230 | 230 | ;; Verify state progression |
231 | 231 | (is (false? (::sut/speaking? initial-state))) |
|
248 | 248 | ::sut/sending-interval sending-interval |
249 | 249 | ::sut/now current-time} |
250 | 250 | frame (frame/audio-output-raw {:audio (byte-array [1 2 3]) :sample-rate 16000}) |
251 | | - [new-state output] (sut/realtime-out-transform state :in frame) |
| 251 | + [new-state output] (sut/base-realtime-out-transform state :in frame) |
252 | 252 | audio-write (first (:audio-write output)) |
253 | | - [next-state] (sut/realtime-out-transform (assoc new-state ::sut/now 1020) :in frame) |
254 | | - [next-state2] (sut/realtime-out-transform (assoc next-state ::sut/now 1025) :in frame)] |
| 253 | + [next-state] (sut/base-realtime-out-transform (assoc new-state ::sut/now 1020) :in frame) |
| 254 | + [next-state2] (sut/base-realtime-out-transform (assoc next-state ::sut/now 1025) :in frame)] |
255 | 255 |
|
256 | 256 | (is (= current-time (:delay-until audio-write))) |
257 | 257 | (is (= current-time (::sut/last-send-time new-state))) |
|
274 | 274 |
|
275 | 275 | ;; Timer tick just under threshold |
276 | 276 | timer-frame-under {:timer/tick true :timer/timestamp (+ base-time 250)} |
277 | | - [state-under output-under] (sut/realtime-out-transform state :timer-out timer-frame-under) |
| 277 | + [state-under output-under] (sut/base-realtime-out-transform state :timer-out timer-frame-under) |
278 | 278 |
|
279 | 279 | ;; Timer tick over threshold |
280 | 280 | timer-frame-over {:timer/tick true :timer/timestamp (+ base-time 350)} |
281 | | - [state-over output-over] (sut/realtime-out-transform state :timer-out timer-frame-over)] |
| 281 | + [state-over output-over] (sut/base-realtime-out-transform state :timer-out timer-frame-over)] |
282 | 282 |
|
283 | 283 | ;; Under threshold: still speaking |
284 | 284 | (is (true? (::sut/speaking? state-under))) |
|
0 commit comments