Skip to content

Commit

Permalink
Fixed tremolo effect in AVSequencer player in order to count back to …
Browse files Browse the repository at this point in the history
…take care that new values are used only after end of current tremor state as well as nit fixes and constify of mixer API.
  • Loading branch information
BastyCDGS committed Dec 12, 2011
1 parent 7a54104 commit 2980fa7
Show file tree
Hide file tree
Showing 10 changed files with 423 additions and 248 deletions.
63 changes: 38 additions & 25 deletions libavsequencer/avsequencer.c
Expand Up @@ -146,7 +146,8 @@ void avsequencer_destroy(AVSequencerContext *avctx)
}
}

AVMixerData *avseq_mixer_init(AVSequencerContext *avctx, AVMixerContext *mixctx,
AVMixerData *avseq_mixer_init(AVSequencerContext *const avctx,
AVMixerContext *const mixctx,
const char *args, void *opaque)
{
AVMixerData *mixer_data = NULL;
Expand Down Expand Up @@ -180,7 +181,8 @@ AVMixerData *avseq_mixer_init(AVSequencerContext *avctx, AVMixerContext *mixctx,
return mixer_data;
}

int avseq_mixer_uninit(AVSequencerContext *avctx, AVMixerData *mixer_data)
int avseq_mixer_uninit(AVSequencerContext *const avctx,
AVMixerData *const mixer_data)
{
AVMixerContext *mixctx;

Expand Down Expand Up @@ -239,8 +241,9 @@ int avseq_mixer_uninit(AVSequencerContext *avctx, AVMixerData *mixer_data)
return 0;
}

uint32_t avseq_mixer_set_rate(AVMixerData *mixer_data, uint32_t new_mix_rate,
uint32_t new_channels)
uint32_t avseq_mixer_set_rate(AVMixerData *const mixer_data,
const uint32_t mix_rate,
const uint32_t channels)
{
AVMixerContext *mixctx;

Expand All @@ -250,6 +253,9 @@ uint32_t avseq_mixer_set_rate(AVMixerData *mixer_data, uint32_t new_mix_rate,
mixctx = mixer_data->mixctx;

if (mixctx && mixctx->set_rate) {
uint32_t new_mix_rate = mix_rate;
uint32_t new_channels = channels;

if (new_mix_rate < mixctx->frequency_min)
new_mix_rate = mixctx->frequency_min;
else if (new_mix_rate > mixctx->frequency_max)
Expand All @@ -264,7 +270,8 @@ uint32_t avseq_mixer_set_rate(AVMixerData *mixer_data, uint32_t new_mix_rate,
return mixer_data->rate;
}

uint32_t avseq_mixer_set_tempo(AVMixerData *mixer_data, uint32_t new_tempo)
uint32_t avseq_mixer_set_tempo(AVMixerData *const mixer_data,
const uint32_t tempo)
{
AVMixerContext *mixctx;

Expand All @@ -273,15 +280,17 @@ uint32_t avseq_mixer_set_tempo(AVMixerData *mixer_data, uint32_t new_tempo)

mixctx = mixer_data->mixctx;

if (new_tempo && mixctx && mixctx->set_tempo)
return mixctx->set_tempo(mixer_data, new_tempo);
if (tempo && mixctx && mixctx->set_tempo)
return mixctx->set_tempo(mixer_data, tempo);

return mixer_data->tempo;
}

uint32_t avseq_mixer_set_volume(AVMixerData *mixer_data, uint32_t amplify,
uint32_t left_volume, uint32_t right_volume,
uint32_t channels)
uint32_t avseq_mixer_set_volume(AVMixerData *const mixer_data,
const uint32_t amplify,
const uint32_t left_volume,
const uint32_t right_volume,
const uint32_t channels)
{
AVMixerContext *mixctx;

Expand All @@ -296,8 +305,9 @@ uint32_t avseq_mixer_set_volume(AVMixerData *mixer_data, uint32_t amplify,
return mixer_data->tempo;
}

void avseq_mixer_get_channel(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel, uint32_t channel)
void avseq_mixer_get_channel(const AVMixerData *const mixer_data,
AVMixerChannel *const mixer_channel,
const uint32_t channel)
{
AVMixerContext *mixctx;

Expand All @@ -310,8 +320,9 @@ void avseq_mixer_get_channel(AVMixerData *mixer_data,
mixctx->get_channel(mixer_data, mixer_channel, channel);
}

void avseq_mixer_set_channel(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel, uint32_t channel)
void avseq_mixer_set_channel(AVMixerData *const mixer_data,
const AVMixerChannel *const mixer_channel,
const uint32_t channel)
{
AVMixerContext *mixctx;

Expand All @@ -324,7 +335,8 @@ void avseq_mixer_set_channel(AVMixerData *mixer_data,
mixctx->set_channel(mixer_data, mixer_channel, channel);
}

void avseq_mixer_reset_channel(AVMixerData *mixer_data, uint32_t channel)
void avseq_mixer_reset_channel(AVMixerData *const mixer_data,
const uint32_t channel)
{
AVMixerContext *mixctx;

Expand All @@ -337,10 +349,10 @@ void avseq_mixer_reset_channel(AVMixerData *mixer_data, uint32_t channel)
mixctx->reset_channel(mixer_data, channel);
}

void avseq_mixer_get_both_channels(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel_current,
AVMixerChannel *mixer_channel_next,
uint32_t channel)
void avseq_mixer_get_both_channels(const AVMixerData *const mixer_data,
AVMixerChannel *const mixer_channel_current,
AVMixerChannel *const mixer_channel_next,
const uint32_t channel)
{
AVMixerContext *mixctx;

Expand All @@ -353,10 +365,10 @@ void avseq_mixer_get_both_channels(AVMixerData *mixer_data,
mixctx->get_both_channels(mixer_data, mixer_channel_current, mixer_channel_next, channel);
}

void avseq_mixer_set_both_channels(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel_current,
AVMixerChannel *mixer_channel_next,
uint32_t channel)
void avseq_mixer_set_both_channels(AVMixerData *const mixer_data,
const AVMixerChannel *const mixer_channel_current,
const AVMixerChannel *const mixer_channel_next,
const uint32_t channel)
{
AVMixerContext *mixctx;

Expand All @@ -369,7 +381,7 @@ void avseq_mixer_set_both_channels(AVMixerData *mixer_data,
mixctx->set_both_channels(mixer_data, mixer_channel_current, mixer_channel_next, channel);
}

void avseq_mixer_do_mix(AVMixerData *mixer_data, int32_t *buf)
void avseq_mixer_do_mix(AVMixerData *const mixer_data, int32_t *buf)
{
AVMixerContext *mixctx;

Expand All @@ -386,7 +398,8 @@ void avseq_mixer_do_mix(AVMixerData *mixer_data, int32_t *buf)
}
}

void avseq_mixer_do_mix_parallel(AVMixerData *mixer_data, int32_t *buf,
void avseq_mixer_do_mix_parallel(AVMixerData *const mixer_data,
int32_t *buf,
const uint32_t first_channel,
const uint32_t last_channel)
{
Expand Down
66 changes: 38 additions & 28 deletions libavsequencer/avsequencer.h
Expand Up @@ -247,8 +247,9 @@ void avsequencer_destroy(AVSequencerContext *avctx);
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
AVMixerData *avseq_mixer_init(AVSequencerContext *avctx, AVMixerContext *mixctx,
const char *args, void *opaque);
AVMixerData *avseq_mixer_init(AVSequencerContext *const avctx,
AVMixerContext *const mixctx,
const char *args, void *opaque);

/**
* Closes and uninitializes an AVSequencer mixer data container.
Expand All @@ -260,39 +261,42 @@ AVMixerData *avseq_mixer_init(AVSequencerContext *avctx, AVMixerContext *mixctx,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
int avseq_mixer_uninit(AVSequencerContext *avctx, AVMixerData *mixer_data);
int avseq_mixer_uninit(AVSequencerContext *const avctx,
AVMixerData *const mixer_data);

/**
* Sets and transfers a new mixing rate and number of output
* channels to the mixing engine.
*
* @param mixer_data the AVMixerData to set the new mixing rate and
* number of output channels of
* @param new_mix_rate the new mixing rate in Hz to use for mixing
* @param new_channels the new number of output channels to use for mixing
* @param mix_rate the new mixing rate in Hz to use for mixing
* @param channels the new number of output channels to use for mixing
* @return the mixing rate in Hz which actually has been set
*
* @note This is part of the new sequencer API which is still under construction.
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
uint32_t avseq_mixer_set_rate(AVMixerData *mixer_data, uint32_t new_mix_rate,
uint32_t new_channels);
uint32_t avseq_mixer_set_rate(AVMixerData *const mixer_data,
const uint32_t mix_rate,
const uint32_t channels);

/**
* Sets and transfers a new tempo for the playback handler to the
* mixing engine.
*
* @param mixer_data the AVMixerData to set the new tempo
* @param new_tempo the new tempo in AV_TIME_BASE fractional seconds
* to use for mixing
* @param tempo the new tempo in AV_TIME_BASE fractional seconds to use
* for mixing
* @return the tempo in AV_TIME_BASE fractional seconds which actually has been set
*
* @note This is part of the new sequencer API which is still under construction.
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
uint32_t avseq_mixer_set_tempo(AVMixerData *mixer_data, uint32_t new_tempo);
uint32_t avseq_mixer_set_tempo(AVMixerData *const mixer_data,
const uint32_t tempo);

/**
* Sets and transfers a new volume boost, left and right volume and
Expand All @@ -312,9 +316,11 @@ uint32_t avseq_mixer_set_tempo(AVMixerData *mixer_data, uint32_t new_tempo);
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
uint32_t avseq_mixer_set_volume(AVMixerData *mixer_data, uint32_t amplify,
uint32_t left_volume, uint32_t right_volume,
uint32_t channels);
uint32_t avseq_mixer_set_volume(AVMixerData *const mixer_data,
const uint32_t amplify,
const uint32_t left_volume,
const uint32_t right_volume,
const uint32_t channels);

/**
* Gets and transfers a channel data block from the internal mixing
Expand All @@ -329,8 +335,9 @@ uint32_t avseq_mixer_set_volume(AVMixerData *mixer_data, uint32_t amplify,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_get_channel(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel, uint32_t channel);
void avseq_mixer_get_channel(const AVMixerData *const mixer_data,
AVMixerChannel *const mixer_channel,
const uint32_t channel);

/**
* Sets and transfers a channel data block from the AVSequencer to the
Expand All @@ -345,8 +352,9 @@ void avseq_mixer_get_channel(AVMixerData *mixer_data,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_set_channel(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel, uint32_t channel);
void avseq_mixer_set_channel(AVMixerData *const mixer_data,
const AVMixerChannel *const mixer_channel,
const uint32_t channel);

/**
* Resets a channel data block from the AVSequencer by setting the
Expand All @@ -359,7 +367,8 @@ void avseq_mixer_set_channel(AVMixerData *mixer_data,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_reset_channel(AVMixerData *mixer_data, uint32_t channel);
void avseq_mixer_reset_channel(AVMixerData *const mixer_data,
const uint32_t channel);

/**
* Gets and transfers a channel data block from the internal mixing
Expand All @@ -377,10 +386,10 @@ void avseq_mixer_reset_channel(AVMixerData *mixer_data, uint32_t channel);
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_get_both_channels(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel_current,
AVMixerChannel *mixer_channel_next,
uint32_t channel);
void avseq_mixer_get_both_channels(const AVMixerData *const mixer_data,
AVMixerChannel *const mixer_channel_current,
AVMixerChannel *const mixer_channel_next,
const uint32_t channel);

/**
* Sets and transfers a channel data block from the AVSequencer to the
Expand All @@ -399,10 +408,10 @@ void avseq_mixer_get_both_channels(AVMixerData *mixer_data,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_set_both_channels(AVMixerData *mixer_data,
AVMixerChannel *mixer_channel_current,
AVMixerChannel *mixer_channel_next,
uint32_t channel);
void avseq_mixer_set_both_channels(AVMixerData *const mixer_data,
const AVMixerChannel *const mixer_channel_current,
const AVMixerChannel *const mixer_channel_next,
const uint32_t channel);

/**
* Fills the output mixing buffer by calculating all the input channel samples.
Expand All @@ -414,7 +423,7 @@ void avseq_mixer_set_both_channels(AVMixerData *mixer_data,
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_do_mix(AVMixerData *mixer_data, int32_t *buf);
void avseq_mixer_do_mix(AVMixerData *const mixer_data, int32_t *buf);

/**
* Fills the output mixing buffer by calculating all the input channel samples
Expand All @@ -432,7 +441,8 @@ void avseq_mixer_do_mix(AVMixerData *mixer_data, int32_t *buf);
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
void avseq_mixer_do_mix_parallel(AVMixerData *mixer_data, int32_t *buf,
void avseq_mixer_do_mix_parallel(AVMixerData *const mixer_data,
int32_t *buf,
const uint32_t first_channel,
const uint32_t last_channel);

Expand Down

0 comments on commit 2980fa7

Please sign in to comment.