diff --git a/ijkmedia/ijkplayer/ff_ffplay.c b/ijkmedia/ijkplayer/ff_ffplay.c index 999036587c082c6c2d7aaff5b9adc354a967231c..1bb42bc1b286e189ea82d433b934a6e48777bddc 100644 --- a/ijkmedia/ijkplayer/ff_ffplay.c +++ b/ijkmedia/ijkplayer/ff_ffplay.c @@ -992,6 +992,9 @@ static void toggle_pause(FFPlayer *ffp, int pause_on) SDL_UnlockMutex(ffp->is->play_mutex); } +// FFP_MERGE: toggle_mute +// FFP_MERGE: update_volume + static void step_to_next_frame_l(FFPlayer *ffp) { VideoState *is = ffp->is; @@ -2063,7 +2066,13 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len) len1 = is->audio_buf_size - is->audio_buf_index; if (len1 > len) len1 = len; - memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1); + if (!is->muted && is->audio_volume == SDL_MIX_MAXVOLUME) + memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1); + else { + memset(stream, is->silence_buf[0], len1); + if (!is->muted) + SDL_MixAudio(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1, is->audio_volume); + } len -= len1; stream += len1; is->audio_buf_index += len1; @@ -2984,6 +2993,8 @@ static VideoState *stream_open(FFPlayer *ffp, const char *filename, AVInputForma init_clock(&is->audclk, &is->audioq.serial); init_clock(&is->extclk, &is->extclk.serial); is->audio_clock_serial = -1; + is->audio_volume = SDL_MIX_MAXVOLUME; + is->muted = 0; is->av_sync_type = ffp->av_sync_type; is->play_mutex = SDL_CreateMutex(); diff --git a/ijkmedia/ijkplayer/ff_ffplay_def.h b/ijkmedia/ijkplayer/ff_ffplay_def.h index ef0282d052a5853fd23a1fc0557ad43943d2bfda..b674f704afa9c3631a2ec7a3975f32f5233cf552 100644 --- a/ijkmedia/ijkplayer/ff_ffplay_def.h +++ b/ijkmedia/ijkplayer/ff_ffplay_def.h @@ -93,6 +93,9 @@ /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ #define SDL_AUDIO_MAX_CALLBACKS_PER_SEC 30 +/* Step size for volume control */ +#define SDL_VOLUME_STEP (SDL_MIX_MAXVOLUME / 50) + /* no AV sync correction is done if below the minimum AV sync threshold */ #define AV_SYNC_THRESHOLD_MIN 0.04 /* AV sync correction is done if above the maximum AV sync threshold */ @@ -295,6 +298,8 @@ typedef struct VideoState { unsigned int audio_buf1_size; int audio_buf_index; /* in bytes */ int audio_write_buf_size; + int audio_volume; + int muted; struct AudioParams audio_src; #if CONFIG_AVFILTER struct AudioParams audio_filter_src; diff --git a/ijkmedia/ijksdl/ijksdl_audio.c b/ijkmedia/ijksdl/ijksdl_audio.c index 53d9d706a0639a7378dcf1be1a48630da3af81bb..7638774e22e9b9a4cd6594c664b176f31351085d 100644 --- a/ijkmedia/ijksdl/ijksdl_audio.c +++ b/ijkmedia/ijksdl/ijksdl_audio.c @@ -37,3 +37,11 @@ void SDL_CalculateAudioSpec(SDL_AudioSpec * spec) spec->size *= spec->channels; spec->size *= spec->samples; } + +void SDL_MixAudio(Uint8* dst, + const Uint8* src, + Uint32 len, + int volume) +{ + // do nothing; +} diff --git a/ijkmedia/ijksdl/ijksdl_audio.h b/ijkmedia/ijksdl/ijksdl_audio.h index 324e80678f98ec5eb7dadc3a042317051082ea1a..0c35d2621a74e14db4f54090004f3ce32facdbab 100644 --- a/ijkmedia/ijksdl/ijksdl_audio.h +++ b/ijkmedia/ijksdl/ijksdl_audio.h @@ -71,6 +71,8 @@ typedef uint16_t SDL_AudioFormat; #define AUDIO_F32SYS AUDIO_F32MSB #endif +#define SDL_MIX_MAXVOLUME (128) + typedef void (*SDL_AudioCallback) (void *userdata, Uint8 * stream, int len); @@ -89,4 +91,9 @@ typedef struct SDL_AudioSpec void SDL_CalculateAudioSpec(SDL_AudioSpec * spec); +void SDL_MixAudio(Uint8* dst, + const Uint8* src, + Uint32 len, + int volume); + #endif