You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1011 B
51 lines
1011 B
2 years ago
|
#pragma once
|
||
|
|
||
|
#include <SDL.h>
|
||
|
#include <SDL_audio.h>
|
||
|
|
||
|
#include <atomic>
|
||
|
#include <cstdint>
|
||
|
#include <vector>
|
||
|
#include <mutex>
|
||
|
|
||
|
//
|
||
|
// SDL Audio capture
|
||
|
//
|
||
|
|
||
|
class audio_async {
|
||
|
public:
|
||
|
audio_async(int len_ms);
|
||
|
~audio_async();
|
||
|
|
||
|
bool init(int capture_id, int sample_rate);
|
||
|
|
||
|
// start capturing audio via the provided SDL callback
|
||
|
// keep last len_ms seconds of audio in a circular buffer
|
||
|
bool resume();
|
||
|
bool pause();
|
||
|
bool clear();
|
||
|
|
||
|
// callback to be called by SDL
|
||
|
void callback(uint8_t * stream, int len);
|
||
|
|
||
|
// get audio data from the circular buffer
|
||
|
void get(int ms, std::vector<float> & audio);
|
||
|
|
||
|
private:
|
||
|
SDL_AudioDeviceID m_dev_id_in = 0;
|
||
|
|
||
|
int m_len_ms = 0;
|
||
|
int m_sample_rate = 0;
|
||
|
|
||
|
std::atomic_bool m_running;
|
||
|
std::mutex m_mutex;
|
||
|
|
||
|
std::vector<float> m_audio;
|
||
|
std::vector<float> m_audio_new;
|
||
|
size_t m_audio_pos = 0;
|
||
|
size_t m_audio_len = 0;
|
||
|
};
|
||
|
|
||
|
// Return false if need to quit
|
||
|
bool sdl_poll_events();
|