summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-12-14 17:00:51 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-12-14 17:00:51 +0200
commit5a6f7804d9a486ee0dd1e04df18cd40c4639c1ce (patch)
treeda611aa5073b25220b1dda8918195be54eeff46e
parentb65c60d2419095c2010b6aeea16887967d7c9a8c (diff)
Audio: Initialize SDL audio only when actually playing
Playing audio is somewhat uncommon, so there is no need to have it set up always.
-rw-r--r--src/audio/player.c21
-rw-r--r--src/main.c3
2 files changed, 21 insertions, 3 deletions
diff --git a/src/audio/player.c b/src/audio/player.c
index 94bcd065..bf853e3f 100644
--- a/src/audio/player.c
+++ b/src/audio/player.c
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
31#include <the_Foundation/thread.h> 31#include <the_Foundation/thread.h>
32#include <SDL_audio.h> 32#include <SDL_audio.h>
33#include <SDL_timer.h> 33#include <SDL_timer.h>
34#include <SDL.h>
34 35
35#if defined (LAGRANGE_ENABLE_MPG123) 36#if defined (LAGRANGE_ENABLE_MPG123)
36# include <mpg123.h> 37# include <mpg123.h>
@@ -739,6 +740,22 @@ size_t sourceDataSize_Player(const iPlayer *d) {
739 return size; 740 return size;
740} 741}
741 742
743static iBool setupSDLAudio_(iBool init) {
744 static iBool isAudioInited_ = iFalse;
745 if (init) {
746 if (SDL_InitSubSystem(SDL_INIT_AUDIO)) {
747 fprintf(stderr, "[SDL] audio init failed: %s\n", SDL_GetError());
748 return iFalse;
749 }
750 isAudioInited_ = iTrue;
751 }
752 else if (isAudioInited_) {
753 SDL_QuitSubSystem(SDL_INIT_AUDIO);
754 isAudioInited_ = iFalse;
755 }
756 return isAudioInited_;
757}
758
742iBool start_Player(iPlayer *d) { 759iBool start_Player(iPlayer *d) {
743 if (isStarted_Player(d)) { 760 if (isStarted_Player(d)) {
744 return iFalse; 761 return iFalse;
@@ -757,6 +774,9 @@ iBool start_Player(iPlayer *d) {
757 } 774 }
758 content.output.callback = writeOutputSamples_Player_; 775 content.output.callback = writeOutputSamples_Player_;
759 content.output.userdata = d; 776 content.output.userdata = d;
777 if (!setupSDLAudio_(iTrue)) {
778 return iFalse;
779 }
760 d->device = SDL_OpenAudioDevice(NULL, SDL_FALSE /* playback */, &content.output, &d->spec, 0); 780 d->device = SDL_OpenAudioDevice(NULL, SDL_FALSE /* playback */, &content.output, &d->spec, 0);
761 if (!d->device) { 781 if (!d->device) {
762 return iFalse; 782 return iFalse;
@@ -796,6 +816,7 @@ void stop_Player(iPlayer *d) {
796 d->device = 0; 816 d->device = 0;
797 delete_Decoder(d->decoder); 817 delete_Decoder(d->decoder);
798 d->decoder = NULL; 818 d->decoder = NULL;
819 setupSDLAudio_(iFalse);
799 } 820 }
800} 821}
801 822
diff --git a/src/main.c b/src/main.c
index 6e5e99e9..cb5e060b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -80,9 +80,6 @@ int main(int argc, char **argv) {
80 fprintf(stderr, "[SDL] init failed: %s\n", SDL_GetError()); 80 fprintf(stderr, "[SDL] init failed: %s\n", SDL_GetError());
81 return -1; 81 return -1;
82 } 82 }
83 if (SDL_Init(SDL_INIT_AUDIO)) {
84 fprintf(stderr, "[SDL] audio init failed: %s\n", SDL_GetError());
85 }
86 init_Updater(); 83 init_Updater();
87 run_App(argc, argv); 84 run_App(argc, argv);
88 SDL_Quit(); 85 SDL_Quit();