forked from enlightenment/efl
ecore_audio: Implement speed get/set functions
You can now change the playback speed of an input Signed-off-by: Daniel Willmann <d.willmann@samsung.com>
This commit is contained in:
parent
75aa9118d0
commit
4d318ba913
|
@ -355,6 +355,27 @@ EAPI int ecore_audio_input_samplerate_get(Ecore_Audio_Object *input);
|
||||||
*/
|
*/
|
||||||
EAPI void ecore_audio_input_samplerate_set(Ecore_Audio_Object *input, int samplerate);
|
EAPI void ecore_audio_input_samplerate_set(Ecore_Audio_Object *input, int samplerate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the speed the input is played back at
|
||||||
|
*
|
||||||
|
* @param input The input
|
||||||
|
*
|
||||||
|
* @return The speed
|
||||||
|
*
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
EAPI double ecore_audio_input_speed_get(Ecore_Audio_Object *input);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the speed the input is played back at
|
||||||
|
*
|
||||||
|
* @param input The input
|
||||||
|
* @param samplerate The speed (1.0 is normal speed)
|
||||||
|
*
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
EAPI void ecore_audio_input_speed_set(Ecore_Audio_Object *input, double speed);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the channels of the input
|
* @brief Get the channels of the input
|
||||||
*
|
*
|
||||||
|
|
|
@ -348,6 +348,7 @@ ecore_audio_input_add(Ecore_Audio_Type type)
|
||||||
in->module = module;
|
in->module = module;
|
||||||
in->output = NULL;
|
in->output = NULL;
|
||||||
in->paused = EINA_FALSE;
|
in->paused = EINA_FALSE;
|
||||||
|
in->speed = 1.0;
|
||||||
|
|
||||||
return module->in_ops->input_new((Ecore_Audio_Object *)in);
|
return module->in_ops->input_new((Ecore_Audio_Object *)in);
|
||||||
}
|
}
|
||||||
|
@ -427,6 +428,32 @@ EAPI void ecore_audio_input_samplerate_set(Ecore_Audio_Object *input, int sample
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI double ecore_audio_input_speed_get(Ecore_Audio_Object *input)
|
||||||
|
{
|
||||||
|
Ecore_Audio_Input* in = (Ecore_Audio_Input *)input;
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(in, 0);
|
||||||
|
|
||||||
|
return in->speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void ecore_audio_input_speed_set(Ecore_Audio_Object *input, double speed)
|
||||||
|
{
|
||||||
|
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(input);
|
||||||
|
Ecore_Audio_Module *outmod;
|
||||||
|
|
||||||
|
if ((in->speed == speed) || (speed < 0.2) || (speed > 5.0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
in->speed = speed;
|
||||||
|
|
||||||
|
if (in->output)
|
||||||
|
{
|
||||||
|
outmod = in->output->module;
|
||||||
|
outmod->out_ops->output_update_input_format((Ecore_Audio_Object *)in->output, input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EAPI int ecore_audio_input_channels_get(Ecore_Audio_Object *input)
|
EAPI int ecore_audio_input_channels_get(Ecore_Audio_Object *input)
|
||||||
{
|
{
|
||||||
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
|
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
|
||||||
|
|
|
@ -283,6 +283,7 @@ struct _Ecore_Audio_Input
|
||||||
int samplerate;
|
int samplerate;
|
||||||
int channels;
|
int channels;
|
||||||
Eina_Bool looped; /**< Loop the sound */
|
Eina_Bool looped; /**< Loop the sound */
|
||||||
|
double speed;
|
||||||
double length; /**< Length of the sound */
|
double length; /**< Length of the sound */
|
||||||
Eina_Bool preloaded;
|
Eina_Bool preloaded;
|
||||||
Eina_Bool ended;
|
Eina_Bool ended;
|
||||||
|
|
|
@ -402,7 +402,7 @@ _pulse_output_add_input(Ecore_Audio_Object *output, Ecore_Audio_Object *input)
|
||||||
|
|
||||||
pa_sample_spec ss = {
|
pa_sample_spec ss = {
|
||||||
.format = PA_SAMPLE_FLOAT32LE,
|
.format = PA_SAMPLE_FLOAT32LE,
|
||||||
.rate = in->samplerate,
|
.rate = in->samplerate * in->speed,
|
||||||
.channels = in->channels,
|
.channels = in->channels,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ _pulse_output_add_input(Ecore_Audio_Object *output, Ecore_Audio_Object *input)
|
||||||
in->obj_data = stream;
|
in->obj_data = stream;
|
||||||
|
|
||||||
pa_stream_set_write_callback(stream, _pulse_output_write_cb, in);
|
pa_stream_set_write_callback(stream, _pulse_output_write_cb, in);
|
||||||
pa_stream_connect_playback(stream, NULL, NULL, PA_STREAM_NOFLAGS, NULL, NULL);
|
pa_stream_connect_playback(stream, NULL, NULL, PA_STREAM_VARIABLE_RATE, NULL, NULL);
|
||||||
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -449,7 +449,7 @@ _pulse_output_update_input_format(Ecore_Audio_Object *output EINA_UNUSED, Ecore_
|
||||||
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
|
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
|
||||||
pa_stream *stream = (pa_stream *)in->obj_data;
|
pa_stream *stream = (pa_stream *)in->obj_data;
|
||||||
|
|
||||||
pa_operation_unref(pa_stream_update_sample_rate(stream, in->samplerate, NULL, NULL));
|
pa_operation_unref(pa_stream_update_sample_rate(stream, in->samplerate * in->speed, NULL, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue