(Audio mixer) You can now specifically set a slot to load a sound in

- set type to AUDIO_MIXER_SLOT_SELECTION_MANUAL and set idx to the
slot you want to load in (begins at 0)
This commit is contained in:
twinaphex 2019-01-18 00:23:22 +01:00
parent 2860d6af08
commit fc57b41ab6
5 changed files with 91 additions and 24 deletions

View File

@ -1172,8 +1172,18 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
if (params->stream_type == AUDIO_STREAM_TYPE_NONE) if (params->stream_type == AUDIO_STREAM_TYPE_NONE)
return false; return false;
if (!audio_driver_mixer_get_free_stream_slot(&free_slot, params->stream_type)) switch (params->slot_selection_type)
return false; {
case AUDIO_MIXER_SLOT_SELECTION_MANUAL:
free_slot = params->slot_selection_idx;
break;
case AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC:
default:
if (!audio_driver_mixer_get_free_stream_slot(
&free_slot, params->stream_type))
return false;
break;
}
if (params->state == AUDIO_STREAM_STATE_NONE) if (params->state == AUDIO_STREAM_STATE_NONE)
return false; return false;

View File

@ -50,6 +50,12 @@ enum audio_action
AUDIO_ACTION_MIXER AUDIO_ACTION_MIXER
}; };
enum audio_mixer_slot_selection_type
{
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC = 0,
AUDIO_MIXER_SLOT_SELECTION_MANUAL
};
enum audio_mixer_stream_type enum audio_mixer_stream_type
{ {
AUDIO_STREAM_TYPE_NONE = 0, AUDIO_STREAM_TYPE_NONE = 0,
@ -174,6 +180,8 @@ typedef struct audio_driver
typedef struct audio_mixer_stream_params typedef struct audio_mixer_stream_params
{ {
float volume; float volume;
enum audio_mixer_slot_selection_type slot_selection_type;
unsigned slot_selection_idx;
enum audio_mixer_stream_type stream_type; enum audio_mixer_stream_type stream_type;
enum audio_mixer_type type; enum audio_mixer_type type;
enum audio_mixer_state state; enum audio_mixer_state state;

View File

@ -2029,7 +2029,10 @@ static int action_ok_audio_add_to_mixer(const char *path,
if (filestream_exists(entry_path)) if (filestream_exists(entry_path))
task_push_audio_mixer_load(entry_path, task_push_audio_mixer_load(entry_path,
NULL, NULL, false); NULL, NULL, false,
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC,
0
);
return 0; return 0;
} }
@ -2048,7 +2051,9 @@ static int action_ok_audio_add_to_mixer_and_play(const char *path,
if (filestream_exists(entry_path)) if (filestream_exists(entry_path))
task_push_audio_mixer_load_and_play(entry_path, task_push_audio_mixer_load_and_play(entry_path,
NULL, NULL, false); NULL, NULL, false,
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC,
0);
return 0; return 0;
} }
@ -2076,7 +2081,9 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path,
if (filestream_exists(combined_path)) if (filestream_exists(combined_path))
task_push_audio_mixer_load(combined_path, task_push_audio_mixer_load(combined_path,
NULL, NULL, false); NULL, NULL, false,
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC,
0);
return 0; return 0;
} }
@ -2104,7 +2111,9 @@ static int action_ok_audio_add_to_mixer_and_collection_and_play(const char *path
if (filestream_exists(combined_path)) if (filestream_exists(combined_path))
task_push_audio_mixer_load_and_play(combined_path, task_push_audio_mixer_load_and_play(combined_path,
NULL, NULL, false); NULL, NULL, false,
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC,
0);
return 0; return 0;
} }

View File

@ -44,6 +44,8 @@ typedef struct nbio_buf
struct audio_mixer_userdata struct audio_mixer_userdata
{ {
enum audio_mixer_stream_type stream_type; enum audio_mixer_stream_type stream_type;
enum audio_mixer_slot_selection_type slot_selection_type;
unsigned slot_selection_idx;
}; };
struct audio_mixer_handle struct audio_mixer_handle
@ -107,6 +109,8 @@ static void task_audio_mixer_handle_upload_ogg(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_OGG; params.type = AUDIO_MIXER_TYPE_OGG;
params.state = AUDIO_STREAM_STATE_STOPPED; params.state = AUDIO_STREAM_STATE_STOPPED;
@ -134,6 +138,8 @@ static void task_audio_mixer_handle_upload_ogg_and_play(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_OGG; params.type = AUDIO_MIXER_TYPE_OGG;
params.state = AUDIO_STREAM_STATE_PLAYING; params.state = AUDIO_STREAM_STATE_PLAYING;
@ -161,6 +167,8 @@ static void task_audio_mixer_handle_upload_flac(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_FLAC; params.type = AUDIO_MIXER_TYPE_FLAC;
params.state = AUDIO_STREAM_STATE_STOPPED; params.state = AUDIO_STREAM_STATE_STOPPED;
@ -188,6 +196,8 @@ static void task_audio_mixer_handle_upload_flac_and_play(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_FLAC; params.type = AUDIO_MIXER_TYPE_FLAC;
params.state = AUDIO_STREAM_STATE_PLAYING; params.state = AUDIO_STREAM_STATE_PLAYING;
@ -215,6 +225,8 @@ static void task_audio_mixer_handle_upload_mp3(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_MP3; params.type = AUDIO_MIXER_TYPE_MP3;
params.state = AUDIO_STREAM_STATE_STOPPED; params.state = AUDIO_STREAM_STATE_STOPPED;
@ -242,6 +254,8 @@ static void task_audio_mixer_handle_upload_mp3_and_play(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_MP3; params.type = AUDIO_MIXER_TYPE_MP3;
params.state = AUDIO_STREAM_STATE_PLAYING; params.state = AUDIO_STREAM_STATE_PLAYING;
@ -269,6 +283,8 @@ static void task_audio_mixer_handle_upload_mod(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_MOD; params.type = AUDIO_MIXER_TYPE_MOD;
params.state = AUDIO_STREAM_STATE_STOPPED; params.state = AUDIO_STREAM_STATE_STOPPED;
@ -296,6 +312,8 @@ static void task_audio_mixer_handle_upload_mod_and_play(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_MOD; params.type = AUDIO_MIXER_TYPE_MOD;
params.state = AUDIO_STREAM_STATE_PLAYING; params.state = AUDIO_STREAM_STATE_PLAYING;
@ -323,6 +341,8 @@ static void task_audio_mixer_handle_upload_wav(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_WAV; params.type = AUDIO_MIXER_TYPE_WAV;
params.state = AUDIO_STREAM_STATE_STOPPED; params.state = AUDIO_STREAM_STATE_STOPPED;
@ -350,6 +370,8 @@ static void task_audio_mixer_handle_upload_wav_and_play(void *task_data,
return; return;
params.volume = 1.0f; params.volume = 1.0f;
params.slot_selection_type = user->slot_selection_type;
params.slot_selection_idx = user->slot_selection_idx;
params.stream_type = user->stream_type; params.stream_type = user->stream_type;
params.type = AUDIO_MIXER_TYPE_WAV; params.type = AUDIO_MIXER_TYPE_WAV;
params.state = AUDIO_STREAM_STATE_PLAYING; params.state = AUDIO_STREAM_STATE_PLAYING;
@ -397,8 +419,11 @@ bool task_audio_mixer_load_handler(retro_task_t *task)
return true; return true;
} }
bool task_push_audio_mixer_load_and_play(const char *fullpath, retro_task_callback_t cb, void *user_data, bool task_push_audio_mixer_load_and_play(
bool system) const char *fullpath, retro_task_callback_t cb, void *user_data,
bool system,
enum audio_mixer_slot_selection_type slot_selection_type,
int slot_selection_idx)
{ {
nbio_handle_t *nbio = NULL; nbio_handle_t *nbio = NULL;
struct audio_mixer_handle *mixer = NULL; struct audio_mixer_handle *mixer = NULL;
@ -460,14 +485,17 @@ bool task_push_audio_mixer_load_and_play(const char *fullpath, retro_task_callba
} }
if (system) if (system)
user->stream_type = AUDIO_STREAM_TYPE_SYSTEM; user->stream_type = AUDIO_STREAM_TYPE_SYSTEM;
else else
user->stream_type = AUDIO_STREAM_TYPE_USER; user->stream_type = AUDIO_STREAM_TYPE_USER;
nbio->data = (struct audio_mixer_handle*)mixer; user->slot_selection_type = slot_selection_type;
nbio->is_finished = false; user->slot_selection_idx = slot_selection_idx;
nbio->cb = &cb_nbio_audio_mixer_load;
nbio->status = NBIO_STATUS_INIT; nbio->data = (struct audio_mixer_handle*)mixer;
nbio->is_finished = false;
nbio->cb = &cb_nbio_audio_mixer_load;
nbio->status = NBIO_STATUS_INIT;
t->state = nbio; t->state = nbio;
t->handler = task_file_load_handler; t->handler = task_file_load_handler;
@ -499,8 +527,11 @@ error:
return false; return false;
} }
bool task_push_audio_mixer_load(const char *fullpath, retro_task_callback_t cb, void *user_data, bool task_push_audio_mixer_load(
bool system) const char *fullpath, retro_task_callback_t cb, void *user_data,
bool system,
enum audio_mixer_slot_selection_type slot_selection_type,
int slot_selection_idx)
{ {
nbio_handle_t *nbio = NULL; nbio_handle_t *nbio = NULL;
struct audio_mixer_handle *mixer = NULL; struct audio_mixer_handle *mixer = NULL;
@ -567,14 +598,17 @@ bool task_push_audio_mixer_load(const char *fullpath, retro_task_callback_t cb,
nbio->status = NBIO_STATUS_INIT; nbio->status = NBIO_STATUS_INIT;
if (system) if (system)
user->stream_type = AUDIO_STREAM_TYPE_SYSTEM; user->stream_type = AUDIO_STREAM_TYPE_SYSTEM;
else else
user->stream_type = AUDIO_STREAM_TYPE_USER; user->stream_type = AUDIO_STREAM_TYPE_USER;
t->state = nbio; user->slot_selection_type = slot_selection_type;
t->handler = task_file_load_handler; user->slot_selection_idx = slot_selection_idx;
t->cleanup = task_audio_mixer_load_free;
t->user_data = user; t->state = nbio;
t->handler = task_file_load_handler;
t->cleanup = task_audio_mixer_load_free;
t->user_data = user;
task_queue_push(t); task_queue_push(t);

View File

@ -29,6 +29,8 @@
#include "../config.h" #include "../config.h"
#endif #endif
#include "../audio/audio_driver.h"
#include "../content.h" #include "../content.h"
#include "../core_type.h" #include "../core_type.h"
#include "../msg_hash.h" #include "../msg_hash.h"
@ -262,11 +264,15 @@ enum frontend_powerstate get_last_powerstate(int *percent);
bool task_push_audio_mixer_load_and_play( bool task_push_audio_mixer_load_and_play(
const char *fullpath, retro_task_callback_t cb, void *user_data, const char *fullpath, retro_task_callback_t cb, void *user_data,
bool system); bool system,
enum audio_mixer_slot_selection_type slot_selection_type,
int slot_selection_idx);
bool task_push_audio_mixer_load( bool task_push_audio_mixer_load(
const char *fullpath, retro_task_callback_t cb, void *user_data, const char *fullpath, retro_task_callback_t cb, void *user_data,
bool system); bool system,
enum audio_mixer_slot_selection_type slot_selection_type,
int slot_selection_idx);
void set_save_state_in_background(bool state); void set_save_state_in_background(bool state);