FuncDoodle
Loading...
Searching...
No Matches
Audio.h
Go to the documentation of this file.
1
5
6#pragma once
7
8#include <cstring>
9#include <iostream>
10#include <portaudio.h>
11#include <vector>
12
13namespace FuncDoodle {
18 struct AudioData {
23 std::vector<float> samples;
38 size_t cur = 0;
43 size_t total = 0;
44 };
45}; // namespace FuncDoodle
46
65static int paCB(const void* inBuf, void* outBuf, unsigned long framesPerBuf,
66 const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags,
67 void* userData) {
68 if (!userData) {
69 return paAbort;
70 }
71
72 auto* data = static_cast<FuncDoodle::AudioData*>(userData);
73 auto* out = static_cast<float*>(outBuf);
74 unsigned long framesLeft = data->total - data->cur;
75 unsigned long framesToProcess =
76 (framesLeft < framesPerBuf) ? framesLeft : framesPerBuf;
77
78 std::memcpy(out, data->samples.data() + (data->cur * data->numChannels),
79 framesToProcess * data->numChannels * sizeof(float));
80
81 data->cur += framesToProcess;
82
83 if (framesToProcess < framesPerBuf) {
84 size_t offset = framesToProcess * data->numChannels;
85
86 memset(out + offset, 0,
87 (framesPerBuf - framesToProcess) * data->numChannels *
88 sizeof(float));
89
90 return paComplete;
91 }
92
93 return paContinue;
94}
static int paCB(const void *inBuf, void *outBuf, unsigned long framesPerBuf, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
PortAudio callback function.
Definition Audio.h:65
The FuncDoodle C++ namespace.
Definition Common.h:12
Represents raw PCM audio data.
Definition Audio.h:18
std::vector< float > samples
Interleaved PCM samples in float format.
Definition Audio.h:23
size_t total
Total number of frames available.
Definition Audio.h:43
size_t cur
Current playback frame offset.
Definition Audio.h:38
int sampleRate
Sample rate in Hz.
Definition Audio.h:28
int numChannels
Number of audio channels in the sample buffer.
Definition Audio.h:33