summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Willmann <d.willmann@samsung.com>2013-03-18 16:05:03 +0000
committerDaniel Willmann <d.willmann@samsung.com>2013-03-18 16:07:42 +0000
commit4719b693e93e6a09bbf29b6f5ebbf592e1e952c3 (patch)
tree721a5956dd32b5c2c59b243606fbc40577ef21cd
parent262f05782b0c7285960a2e2d2beac9b778ce555f (diff)
downloadefl-4719b693e93e6a09bbf29b6f5ebbf592e1e952c3.tar.gz
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>
-rw-r--r--src/lib/ecore_audio/Ecore_Audio.h21
-rw-r--r--src/lib/ecore_audio/ecore_audio.c27
-rw-r--r--src/lib/ecore_audio/ecore_audio_private.h1
-rw-r--r--src/lib/ecore_audio/ecore_audio_pulse.c6
4 files changed, 52 insertions, 3 deletions
diff --git a/src/lib/ecore_audio/Ecore_Audio.h b/src/lib/ecore_audio/Ecore_Audio.h
index 966501d316..384791021d 100644
--- a/src/lib/ecore_audio/Ecore_Audio.h
+++ b/src/lib/ecore_audio/Ecore_Audio.h
@@ -356,6 +356,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);
/**
+ * @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
*
* @param input The input
diff --git a/src/lib/ecore_audio/ecore_audio.c b/src/lib/ecore_audio/ecore_audio.c
index 1a1e86376c..014cc252cb 100644
--- a/src/lib/ecore_audio/ecore_audio.c
+++ b/src/lib/ecore_audio/ecore_audio.c
@@ -341,6 +341,7 @@ ecore_audio_input_add(Ecore_Audio_Type type)
in->module = module;
in->output = NULL;
in->paused = EINA_FALSE;
+ in->speed = 1.0;
return module->in_ops->input_new((Ecore_Audio_Object *)in);
}
@@ -420,6 +421,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)
{
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
diff --git a/src/lib/ecore_audio/ecore_audio_private.h b/src/lib/ecore_audio/ecore_audio_private.h
index 2f9649986d..9c0011e594 100644
--- a/src/lib/ecore_audio/ecore_audio_private.h
+++ b/src/lib/ecore_audio/ecore_audio_private.h
@@ -283,6 +283,7 @@ struct _Ecore_Audio_Input
int samplerate;
int channels;
Eina_Bool looped; /**< Loop the sound */
+ double speed;
double length; /**< Length of the sound */
Eina_Bool preloaded;
Eina_Bool ended;
diff --git a/src/lib/ecore_audio/ecore_audio_pulse.c b/src/lib/ecore_audio/ecore_audio_pulse.c
index ce326c23e3..0db00ccf4a 100644
--- a/src/lib/ecore_audio/ecore_audio_pulse.c
+++ b/src/lib/ecore_audio/ecore_audio_pulse.c
@@ -402,7 +402,7 @@ _pulse_output_add_input(Ecore_Audio_Object *output, Ecore_Audio_Object *input)
pa_sample_spec ss = {
.format = PA_SAMPLE_FLOAT32LE,
- .rate = in->samplerate,
+ .rate = in->samplerate * in->speed,
.channels = in->channels,
};
@@ -416,7 +416,7 @@ _pulse_output_add_input(Ecore_Audio_Object *output, Ecore_Audio_Object *input)
in->obj_data = stream;
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;
}
@@ -449,7 +449,7 @@ _pulse_output_update_input_format(Ecore_Audio_Object *output EINA_UNUSED, Ecore_
Ecore_Audio_Input *in = (Ecore_Audio_Input *)input;
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