mirror of
https://github.com/baketnk/frame-yap.git
synced 2026-10-06 02:00:06 +02:00
Bound captured PCM to the ASR normalized amplitude range
This commit is contained in:
1 parent
3190877587
commit
019b8132bb
6 files changed
+51
-5
No files matched your search
@@ -4,6 +4,7 @@
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace {
|
||||
@@ -52,6 +53,31 @@ int main() {
|
||||
feed(0.9f, 100); audio.start(); feed(0.4f, 3200);
|
||||
clip = audio.finish(); assert(clip.size() == 3200 && clip.front() == 0.4f);
|
||||
assert(opens == 1 && closes == 0 && resumes == 1);
|
||||
// Real float capture can exceed full scale. Both poll and finish must
|
||||
// saturate finite peaks without changing ordinary samples or clip size.
|
||||
audio.start();
|
||||
feed(1.01f, 1600); feed(-1.25f, 1600); audio.poll();
|
||||
feed(std::numeric_limits<float>::max(), 1);
|
||||
feed(-std::numeric_limits<float>::max(), 1);
|
||||
feed(1.f, 1); feed(-1.f, 1); feed(.25f, 1); feed(0.f, 1);
|
||||
clip = audio.finish();
|
||||
assert(clip.size() == 3206);
|
||||
assert(std::all_of(clip.begin(), clip.begin() + 1600, [](float x) { return x == 1.f; }));
|
||||
assert(std::all_of(clip.begin() + 1600, clip.begin() + 3200, [](float x) { return x == -1.f; }));
|
||||
assert(clip[3200] == 1.f && clip[3201] == -1.f && clip[3202] == 1.f && clip[3203] == -1.f);
|
||||
assert(clip[3204] == .25f && clip[3205] == 0.f);
|
||||
for (float invalid : {std::numeric_limits<float>::infinity(),
|
||||
-std::numeric_limits<float>::infinity(),
|
||||
std::numeric_limits<float>::quiet_NaN()}) {
|
||||
audio.start(); feed(.2f, 3200); feed(invalid, 1);
|
||||
bool rejected = false;
|
||||
try { (void)audio.finish(); } catch (const std::runtime_error&) { rejected = true; }
|
||||
assert(rejected && !audio.recording() && current->queued.empty());
|
||||
audio.start(); feed(.3f, 3200);
|
||||
clip = audio.finish();
|
||||
assert(clip.size() == 3200 && clip.front() == .3f); // no failed clip tail leaks
|
||||
}
|
||||
assert(opens == 1 && closes == 0 && resumes == 1);
|
||||
removed = true;
|
||||
bool failed = false;
|
||||
try { audio.poll(); } catch (const std::runtime_error&) { failed = true; }
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <filesystem>
|
||||
#include <functional>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <sys/stat.h>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
@@ -40,6 +41,15 @@ int main(int argc, char** argv) {
|
||||
try { worker.submit(1, std::vector<float>(3199)); }
|
||||
catch (const std::invalid_argument&) { rejected = true; }
|
||||
assert(rejected);
|
||||
for (float value : {1.01f, -1.01f, std::numeric_limits<float>::infinity(),
|
||||
std::numeric_limits<float>::quiet_NaN()}) {
|
||||
auto invalid = clip; invalid.back() = value;
|
||||
rejected = false;
|
||||
try { worker.submit(99, invalid); }
|
||||
catch (const std::invalid_argument&) { rejected = true; }
|
||||
assert(rejected && worker.ready()); // rejection happens before clip/IPC mutation
|
||||
}
|
||||
clip.front() = -1.f; clip.back() = 1.f; // full-scale boundaries are valid
|
||||
worker.submit(100, clip);
|
||||
rejected = false;
|
||||
try { worker.submit(101, clip); }
|
||||
|
||||
Reference in new issue
Block a user