Use speaker as audio input

This commit is contained in:
dijunkun
2024-07-19 14:10:35 +08:00
parent ff6f295fac
commit 5a1e2c5ed9
4 changed files with 65 additions and 24 deletions

View File

@@ -217,6 +217,40 @@ int Render::Run() {
screen_width_ = DM.w; screen_width_ = DM.w;
screen_height_ = DM.h; screen_height_ = DM.h;
// Audio
SDL_AudioSpec want_in, have_in, want_out, have_out;
SDL_zero(want_in);
want_in.freq = 48000;
want_in.format = AUDIO_S16LSB;
want_in.channels = 1;
want_in.samples = 480;
want_in.callback = SdlCaptureAudioIn;
want_in.userdata = this;
input_dev_ = SDL_OpenAudioDevice(NULL, 1, &want_in, &have_in, 0);
if (input_dev_ == 0) {
SDL_Log("Failed to open input: %s", SDL_GetError());
// return 1;
}
SDL_zero(want_out);
want_out.freq = 48000;
want_out.format = AUDIO_S16LSB;
want_out.channels = 1;
// want_out.silence = 0;
want_out.samples = 480;
want_out.callback = SdlCaptureAudioOut;
want_out.userdata = this;
output_dev_ = SDL_OpenAudioDevice(NULL, 0, &want_out, &have_out, 0);
if (output_dev_ == 0) {
SDL_Log("Failed to open input: %s", SDL_GetError());
// return 1;
}
SDL_PauseAudioDevice(input_dev_, 0);
SDL_PauseAudioDevice(output_dev_, 0);
// Setup Dear ImGui context // Setup Dear ImGui context
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();
ImGui::CreateContext(); ImGui::CreateContext();

View File

@@ -61,8 +61,9 @@ class Render {
private: private:
int ProcessMouseKeyEven(SDL_Event &ev); int ProcessMouseKeyEven(SDL_Event &ev);
void SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len);
void SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len); static void SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len);
static void SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len);
private: private:
int SaveSettingsIntoCacheFile(); int SaveSettingsIntoCacheFile();

View File

@@ -78,34 +78,40 @@ int Render::ProcessMouseKeyEven(SDL_Event &ev) {
} }
void Render::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) { void Render::SdlCaptureAudioIn(void *userdata, Uint8 *stream, int len) {
if (1) { // Render *render = (Render *)userdata;
if ("Connected" == connection_status_str_) { // if (1) {
SendData(peer_, DATA_TYPE::AUDIO, (const char *)stream, len); // if ("Connected" == render->connection_status_str_) {
} // SendData(render->peer_, DATA_TYPE::AUDIO, (const char *)stream, len);
} else { // }
memcpy(audio_buffer_, stream, len); // } else {
audio_len_ = len; // memcpy(render->audio_buffer_, stream, len);
SDL_Delay(10); // render->audio_len_ = len;
audio_buffer_fresh_ = true; // SDL_Delay(10);
} // render->audio_buffer_fresh_ = true;
// }
} }
void Render::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) { void Render::SdlCaptureAudioOut(void *userdata, Uint8 *stream, int len) {
if (!audio_buffer_fresh_) { Render *render = (Render *)userdata;
return; if ("Connected" == render->connection_status_str_) {
SendData(render->peer_, DATA_TYPE::AUDIO, (const char *)stream, len);
} }
SDL_memset(stream, 0, len); // if (!render->audio_buffer_fresh_) {
// return;
// }
if (audio_len_ == 0) { // SDL_memset(stream, 0, len);
return;
} else {
}
len = (len > audio_len_ ? audio_len_ : len); // if (render->audio_len_ == 0) {
SDL_MixAudioFormat(stream, audio_buffer_, AUDIO_S16LSB, len, // return;
SDL_MIX_MAXVOLUME); // } else {
audio_buffer_fresh_ = false; // }
// len = (len > render->audio_len_ ? render->audio_len_ : len);
// SDL_MixAudioFormat(stream, render->audio_buffer_, AUDIO_S16LSB, len,
// SDL_MIX_MAXVOLUME);
// render->audio_buffer_fresh_ = false;
} }
void Render::OnReceiveVideoBufferCb(const char *data, size_t size, void Render::OnReceiveVideoBufferCb(const char *data, size_t size,

View File

@@ -129,7 +129,7 @@ target("remote_desk")
set_kind("binary") set_kind("binary")
add_deps("rd_log", "common", "single_window") add_deps("rd_log", "common", "single_window")
if is_os("windows") then if is_os("windows") then
add_files("icon/app_icon.ico") add_files("icon/app.rc")
elseif is_os("macosx") then elseif is_os("macosx") then
add_packages("ffmpeg") add_packages("ffmpeg")
elseif is_os("linux") then elseif is_os("linux") then