#include "bmusb/fake_capture.h"
#include <assert.h>
+#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#if __SSE2__
#include <immintrin.h>
#endif
+#include <chrono>
#include <cstddef>
#include "bmusb/bmusb.h"
constexpr uint8_t crs[NUM_COLORS] = { 240, 34, 110, 128 };
using namespace std;
+using namespace std::chrono;
namespace bmusb {
namespace {
} // namespace
FakeCapture::FakeCapture(unsigned width, unsigned height, unsigned fps, unsigned audio_sample_frequency, int card_index, bool has_audio)
- : width(width), height(height), fps(fps), audio_sample_frequency(audio_sample_frequency)
+ : width(width), height(height), fps(fps), audio_sample_frequency(audio_sample_frequency), card_index(card_index)
{
char buf[256];
snprintf(buf, sizeof(buf), "Fake card %d", card_index + 1);
void FakeCapture::producer_thread_func()
{
+ char thread_name[16];
+ snprintf(thread_name, sizeof(thread_name), "FakeCapture_%d", card_index);
+ pthread_setname_np(pthread_self(), thread_name);
+
uint16_t timecode = 0;
if (has_dequeue_callbacks) {
next_frame = now;
}
}
+ steady_clock::time_point timestamp = steady_clock::now();
// Figure out when the next frame is to be, then compute the current one.
add_time(1.0 / fps, &next_frame);
memset4(video_frame.data, ycbcr, width * height / 2);
}
video_frame.len = width * height * 2;
+ video_frame.received_timestamp = timestamp;
}
AudioFormat audio_format;
audio_format.bits_per_sample = 32;
- audio_format.num_channels = 2;
+ audio_format.num_channels = 8;
FrameAllocator::Frame audio_frame = audio_frame_allocator->alloc_frame();
if (audio_frame.data != nullptr) {
const unsigned num_stereo_samples = audio_sample_frequency / fps;
- assert(audio_frame.size >= 2 * sizeof(int32_t) * num_stereo_samples);
- audio_frame.len = 2 * sizeof(int32_t) * num_stereo_samples;
+ assert(audio_frame.size >= audio_format.num_channels * sizeof(int32_t) * num_stereo_samples);
+ audio_frame.len = audio_format.num_channels * sizeof(int32_t) * num_stereo_samples;
+ audio_frame.received_timestamp = timestamp;
if (audio_sin == 0.0f) {
// Silence.
memset(audio_frame.data, 0, audio_frame.len);
} else {
- make_tone((int32_t *)audio_frame.data, num_stereo_samples);
+ make_tone((int32_t *)audio_frame.data, num_stereo_samples, audio_format.num_channels);
}
}
}
}
-void FakeCapture::make_tone(int32_t *out, unsigned num_stereo_samples)
+void FakeCapture::make_tone(int32_t *out, unsigned num_stereo_samples, unsigned num_channels)
{
int32_t *ptr = out;
float r = audio_real, i = audio_imag;
for (unsigned sample_num = 0; sample_num < num_stereo_samples; ++sample_num) {
int32_t s = lrintf(r);
- *ptr++ = s;
- *ptr++ = s;
+ for (unsigned i = 0; i < num_channels; ++i) {
+ *ptr++ = s;
+ }
// Rotate the phaser by one sample.
float new_r = r * audio_cos - i * audio_sin;