only open microphone when actually needed. fixes #1165

This commit is contained in:
Arisotura 2021-07-29 01:19:03 +02:00
parent 9ee2017443
commit aaa97c9242
1 changed files with 46 additions and 20 deletions

View File

@ -106,6 +106,8 @@ u32 micExtBufferWritePos;
u32 micWavLength;
s16* micWavBuffer;
void micCallback(void* data, Uint8* stream, int len);
void audioCallback(void* data, Uint8* stream, int len)
{
@ -143,6 +145,40 @@ void audioCallback(void* data, Uint8* stream, int len)
}
void micOpen()
{
if (Config::MicInputType != 1)
{
micDevice = 0;
return;
}
SDL_AudioSpec whatIwant, whatIget;
memset(&whatIwant, 0, sizeof(SDL_AudioSpec));
whatIwant.freq = 44100;
whatIwant.format = AUDIO_S16LSB;
whatIwant.channels = 1;
whatIwant.samples = 1024;
whatIwant.callback = micCallback;
micDevice = SDL_OpenAudioDevice(NULL, 1, &whatIwant, &whatIget, 0);
if (!micDevice)
{
printf("Mic init failed: %s\n", SDL_GetError());
}
else
{
SDL_PauseAudioDevice(micDevice, 0);
}
}
void micClose()
{
if (micDevice)
SDL_CloseAudioDevice(micDevice);
micDevice = 0;
}
void micLoadWav(const char* name)
{
SDL_AudioSpec format;
@ -623,7 +659,7 @@ void EmuThread::emuRun()
// checkme
emit windowEmuStart();
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0);
if (micDevice) SDL_PauseAudioDevice(micDevice, 0);
micOpen();
}
void EmuThread::emuPause()
@ -636,7 +672,7 @@ void EmuThread::emuPause()
while (EmuStatus != 2);
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1);
if (micDevice) SDL_PauseAudioDevice(micDevice, 1);
micClose();
}
void EmuThread::emuUnpause()
@ -649,7 +685,7 @@ void EmuThread::emuUnpause()
EmuRunning = PrevEmuStatus;
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0);
if (micDevice) SDL_PauseAudioDevice(micDevice, 0);
micOpen();
}
void EmuThread::emuStop()
@ -658,7 +694,7 @@ void EmuThread::emuStop()
EmuPause = 0;
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1);
if (micDevice) SDL_PauseAudioDevice(micDevice, 1);
micClose();
}
void EmuThread::emuFrameStep()
@ -2393,6 +2429,8 @@ void MainWindow::onOpenAudioSettings()
void MainWindow::onAudioSettingsFinished(int res)
{
micClose();
if (Config::MicInputType == 3)
{
micLoadWav(Config::MicWavPath);
@ -2408,6 +2446,8 @@ void MainWindow::onAudioSettingsFinished(int res)
else
Frontend::Mic_SetExternalBuffer(NULL, 0);
}
micOpen();
}
void MainWindow::onOpenWifiSettings()
@ -2751,21 +2791,7 @@ int main(int argc, char** argv)
SDL_PauseAudioDevice(audioDevice, 1);
}
memset(&whatIwant, 0, sizeof(SDL_AudioSpec));
whatIwant.freq = 44100;
whatIwant.format = AUDIO_S16LSB;
whatIwant.channels = 1;
whatIwant.samples = 1024;
whatIwant.callback = micCallback;
micDevice = SDL_OpenAudioDevice(NULL, 1, &whatIwant, &whatIget, 0);
if (!micDevice)
{
printf("Mic init failed: %s\n", SDL_GetError());
}
else
{
SDL_PauseAudioDevice(micDevice, 1);
}
micDevice = 0;
memset(micExtBuffer, 0, sizeof(micExtBuffer));
@ -2836,7 +2862,7 @@ int main(int argc, char** argv)
Frontend::DeInit_ROM();
if (audioDevice) SDL_CloseAudioDevice(audioDevice);
if (micDevice) SDL_CloseAudioDevice(micDevice);
micClose();
SDL_DestroyCond(audioSync);
SDL_DestroyMutex(audioSyncLock);