Writing gst plug-ins for Maemo

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Writing gst plug-ins for Maemo

Ryan McGee
Hi, I am new to gstreamer, but have experience with desktop audio programming on osx/win using PortAudio and JUCE.  I've been following the Plugin Writer's Guide to learn how to write my own audio effect plugins for use on a Maemo device.  I've been working off the latest gst-template git module:
shell $ git clone git://anongit.freedesktop.org/gstreamer/gst-template.git

I was successful in using the provided "make element" tool to create the C and header files (based off of gstplugin.c/h), compile and deploy using Qt Creator, and use the template plug-in on my phone.

Now, I'm trying to understand how to modify the audio buffers correctly.

The template code has the following function where the processing occurs:

/* chain function
 * this function does the actual processing
 */
static GstFlowReturn
gst_plugin_template_chain (GstPad * pad, GstBuffer * buf)
{
  GstPluginTemplate *filter;

  filter = GST_PLUGIN_TEMPLATE (GST_OBJECT_PARENT (pad));

  if (filter->silent == FALSE)
    g_print ("I'm plugged, therefore I'm in.\n");

  /* just push out the incoming buffer without touching it */
  return gst_pad_push (filter->srcpad, buf);
}

The above works as promised- it just passes the audio straight through without modification.

So, as a test, I tried to simply zero the buffer so no sound would pass through:

/* chain function
 * this function does the actual processing
 */
static GstFlowReturn
gst_ryanfilter_chain (GstPad * pad, GstBuffer * buf)
{
  Gstryanfilter *filter;

  filter = GST_RYANFILTER (GST_OBJECT_PARENT (pad));

  if (filter->silent == FALSE)
    g_print ("I'm plugged, therefore I'm in.\n");

  guint8 *in = GST_BUFFER_DATA(buf);
  guint8 length = GST_BUFFER_SIZE(buf);

  int i;
  for(i = 0; i < length; i++){
      *in++ = 0; // in[i] = 0;
  }

  return gst_pad_push (filter->srcpad, buf);
}

This results in some clicks in the audio stream, but the incoming audio is still passing through.  Why is this?  Is there somewhere else writing to the output of the plug-in?  My graph is pulsesrc ! ryanfilter ! pulsesink

I also noticed that the template folder provides a gstaudiofilter.c example.  This compiles and deploys in Qt, but I get assertion failures on the device when I try to use this.  Any ideas?

Thank you!
Ryan
Reply | Threaded
Open this post in threaded view
|

Re: Writing gst plug-ins for Maemo

Stefan Sauer
On 07/20/11 02:14, Ryan McGee wrote:
> Hi, I am new to gstreamer, but have experience with desktop audio programming
> on osx/win using PortAudio and JUCE.  I've been following the Plugin
> Writer's Guide to learn how to write my own audio effect plugins for use on
> a Maemo device.  I've been working off the latest gst-template git module:
> shell $ git clone git://anongit.freedesktop.org/gstreamer/gst-template.git
FYI. gst-plugin-bad now has the new element-maker, with a lot more
templates. Just clone gst-plugin-bad from git to get it - no need to
build it, the tool is a shell-script.

> I was successful in using the provided "make element" tool to create the C
> and header files (based off of gstplugin.c/h), compile and deploy using Qt
> Creator, and use the template plug-in on my phone.
>
> Now, I'm trying to understand how to modify the audio buffers correctly.
>
> The template code has the following function where the processing occurs:
>
> /* chain function
>  * this function does the actual processing
>  */
> static GstFlowReturn
> gst_plugin_template_chain (GstPad * pad, GstBuffer * buf)
> {
>   GstPluginTemplate *filter;
>
>   filter = GST_PLUGIN_TEMPLATE (GST_OBJECT_PARENT (pad));
>
>   if (filter->silent == FALSE)
>     g_print ("I'm plugged, therefore I'm in.\n");
>
>   /* just push out the incoming buffer without touching it */
>   return gst_pad_push (filter->srcpad, buf);
> }
>
> The above works as promised- it just passes the audio straight through
> without modification.
>
> So, as a test, I tried to simply zero the buffer so no sound would pass
> through:
>
> /* chain function
>  * this function does the actual processing
>  */
> static GstFlowReturn
> gst_ryanfilter_chain (GstPad * pad, GstBuffer * buf)
> {
>   Gstryanfilter *filter;
>
>   filter = GST_RYANFILTER (GST_OBJECT_PARENT (pad));
>
>   if (filter->silent == FALSE)
>     g_print ("I'm plugged, therefore I'm in.\n");
>
>   guint8 *in = GST_BUFFER_DATA(buf);
>   guint8 length = GST_BUFFER_SIZE(buf);
>
>   int i;
>   for(i = 0; i < length; i++){
>       *in++ = 0; // in[i] = 0;
>   }
>
>   return gst_pad_push (filter->srcpad, buf);
> }
>
> This results in some clicks in the audio stream, but the incoming audio is
> still passing through.  Why is this?  Is there somewhere else writing to the
> output of the plug-in?  My graph is pulsesrc ! ryanfilter ! pulsesink
try:
  audiotestsrc ! pulsesink
and
  audiotestsrc ! ryanfilter ! pulsesink

to narrow it down (to exclude the the mic-in to monitored on the
speakers in addition).

Stefan

> I also noticed that the template folder provides a gstaudiofilter.c example.
> This compiles and deploys in Qt, but I get assertion failures on the device
> when I try to use this.  Any ideas?
>
> Thank you!
> Ryan
>
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Writing-gst-plug-ins-for-Maemo-tp3679695p3679695.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel