How to detect signal level without creating a "fakesink" audio-pipeline?

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

How to detect signal level without creating a "fakesink" audio-pipeline?

Osmo Maatta
Hello,

I would like improve my audio-recorder software. It uses GStreamer for
the recording task.

The recorder has a "timer" that can start recording if it detects sound
input on the line. The timer is simply a textual command that is
interpreted by the program.

These are examples of the "timer" actions:

start if voice 5s
# pause if silence 8 seconds
# start at 14:50 pm
# stop if silence

To my question:
Let's take the first command (start if voice 5s) as an example.

The timer process notices the "start if voice" command and creates a
audio-pipeline that listens to the selected device. It will start
recording if detects a signal/audio/voice that lasts at least 5 seconds
time.

The timer calls the listener module that creates this pipeline:

$ gst-launch-0.10 pulsesrc
device="alsa_output.pci-0000_06_01.0.analog-stereo.monitor" name=source0
! level name=level ! queue ! audioconvert ! audio/x-raw-int,channels=1 !
fakesink name=output-sink

Notice that this records to a "fakesink" sink and its output is
discarded. The listener does only care about the signal level.

This pipeline sets up a callback function on "message::element" signal
(in src/gst-listener.c module)

g_signal_connect(bus, "message::element",
G_CALLBACK(listener_message_handler), NULL);

That calls (in src/gst-listener.c module)
static gboolean listener_message_handler(GstBus * bus, GstMessage *
message, gpointer data) {

...
}

This is how the timer/listener can start the REAL RECORDING PROCESS if
it detects some signal/audio/voice on the line.

Please see the src/gst-listener.c (and src/timer.c) modules here:
http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/gst-listener.c

http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/timer.c
------

The annoying thing is that this fakesink recorder (pipeline) is also
VISIBLE in the GNOME's "Sound Preferences" dialog.

Take a look at this picture:
http://bildr.no/view/949174   (the fakesink recorder/listener is
annoyingly visible in the settings)

Here is another picture:
http://bildr.no/view/949177
This picture shows both the "fakesink" listener pipeline that tries to
detect "silence". The second is the REAL GStreamer-recorder that outputs
the a disc file.

The question:
=============

Is there any better way to detect the signal level (audio level) in
GStreamer? I want a method that avoids this visible "fakesink" recorder.
Can I monitor signal level on any device (eg. audio card, webcam,
microphone) without pipeline?

I hope you understand my question ;-)

-----
Here are couple of pictures of the recorder
http://ubuntuforums.org/showthread.php?t=1672679

Source code on the Launchpad
https://launchpad.net/audio-recorder

Most kindly
  Moma Antero
  Oslo, Norway
_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: How to detect signal level without creating a "fakesink" audio-pipeline?

Osmo Maatta
Bump.
Any comments?

On 08/13/2011 01:05 PM, Osmo Antero wrote:

> Hello,
>
> I would like improve my audio-recorder software. It uses GStreamer for
> the recording task.
>
> The recorder has a "timer" that can start recording if it detects sound
> input on the line. The timer is simply a textual command that is
> interpreted by the program.
>
> These are examples of the "timer" actions:
>
> start if voice 5s
> # pause if silence 8 seconds
> # start at 14:50 pm
> # stop if silence
>
> To my question:
> Let's take the first command (start if voice 5s) as an example.
>
> The timer process notices the "start if voice" command and creates a
> audio-pipeline that listens to the selected device. It will start
> recording if detects a signal/audio/voice that lasts at least 5 seconds
> time.
>
> The timer calls the listener module that creates this pipeline:
>
> $ gst-launch-0.10 pulsesrc
> device="alsa_output.pci-0000_06_01.0.analog-stereo.monitor" name=source0
> ! level name=level ! queue ! audioconvert ! audio/x-raw-int,channels=1 !
> fakesink name=output-sink
>
> Notice that this records to a "fakesink" sink and its output is
> discarded. The listener does only care about the signal level.
>
> This pipeline sets up a callback function on "message::element" signal
> (in src/gst-listener.c module)
>
> g_signal_connect(bus, "message::element",
> G_CALLBACK(listener_message_handler), NULL);
>
> That calls (in src/gst-listener.c module)
> static gboolean listener_message_handler(GstBus * bus, GstMessage *
> message, gpointer data) {
>
> ...
> }
>
> This is how the timer/listener can start the REAL RECORDING PROCESS if
> it detects some signal/audio/voice on the line.
>
> Please see the src/gst-listener.c (and src/timer.c) modules here:
> http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/gst-listener.c
>
>
> http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/timer.c
>
> ------
>
> The annoying thing is that this fakesink recorder (pipeline) is also
> VISIBLE in the GNOME's "Sound Preferences" dialog.
>
> Take a look at this picture:
> http://bildr.no/view/949174 (the fakesink recorder/listener is
> annoyingly visible in the settings)
>
> Here is another picture:
> http://bildr.no/view/949177
> This picture shows both the "fakesink" listener pipeline that tries to
> detect "silence". The second is the REAL GStreamer-recorder that outputs
> the a disc file.
>
> The question:
> =============
>
> Is there any better way to detect the signal level (audio level) in
> GStreamer? I want a method that avoids this visible "fakesink" recorder.
> Can I monitor signal level on any device (eg. audio card, webcam,
> microphone) without pipeline?
>
> I hope you understand my question ;-)
>
> -----
> Here are couple of pictures of the recorder
> http://ubuntuforums.org/showthread.php?t=1672679
>
> Source code on the Launchpad
> https://launchpad.net/audio-recorder
>
> Most kindly
> Moma Antero
> Oslo, Norway

_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: How to detect signal level without creating a "fakesink" audio-pipeline?

Stefan Sauer
In reply to this post by Osmo Maatta
On 08/13/11 13:05, Osmo Antero wrote:

> Hello,
>
> I would like improve my audio-recorder software. It uses GStreamer for
> the recording task.
>
> The recorder has a "timer" that can start recording if it detects
> sound input on the line. The timer is simply a textual command that is
> interpreted by the program.
>
> These are examples of the "timer" actions:
>
> start if voice 5s
> # pause if silence 8 seconds
> # start at 14:50 pm
> # stop if silence
>
> To my question:
> Let's take the first command (start if voice 5s) as an example.
>
> The timer process notices the "start if voice" command and creates a
> audio-pipeline that listens to the selected device. It will start
> recording if detects a signal/audio/voice that lasts at least 5
> seconds time.
>
> The timer calls the listener module that creates this pipeline:
>
> $ gst-launch-0.10 pulsesrc
> device="alsa_output.pci-0000_06_01.0.analog-stereo.monitor"
> name=source0 ! level name=level ! queue ! audioconvert !
> audio/x-raw-int,channels=1 ! fakesink name=output-sink
>
> Notice that this records to a "fakesink" sink and its output is
> discarded. The listener does only care about the signal level.
>
> This pipeline sets up a callback function on "message::element" signal
> (in src/gst-listener.c module)
>
> g_signal_connect(bus, "message::element",
> G_CALLBACK(listener_message_handler), NULL);
>
> That calls (in src/gst-listener.c module)
> static gboolean listener_message_handler(GstBus * bus, GstMessage *
> message, gpointer data) {
>
> ...
> }
>
> This is how the timer/listener can start the REAL RECORDING PROCESS if
> it detects some signal/audio/voice on the line.
>
> Please see the src/gst-listener.c (and src/timer.c) modules here:
> http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/gst-listener.c
>
>
> http://bazaar.launchpad.net/~osmoma/audio-recorder/trunk/view/head:/src/timer.c
>
> ------
>
> The annoying thing is that this fakesink recorder (pipeline) is also
> VISIBLE in the GNOME's "Sound Preferences" dialog.
>
> Take a look at this picture:
> http://bildr.no/view/949174   (the fakesink recorder/listener is
> annoyingly visible in the settings)
>
> Here is another picture:
> http://bildr.no/view/949177
> This picture shows both the "fakesink" listener pipeline that tries to
> detect "silence". The second is the REAL GStreamer-recorder that
> outputs the a disc file.
>
> The question:
> =============
>
> Is there any better way to detect the signal level (audio level) in
> GStreamer? I want a method that avoids this visible "fakesink"
> recorder. Can I monitor signal level on any device (eg. audio card,
> webcam, microphone) without pipeline?

There is a level element. You also find examples of using it in the
element docs and under gst-plgin-good/tests/examples/

Stefan

>
> I hope you understand my question ;-)
>
> -----
> Here are couple of pictures of the recorder
> http://ubuntuforums.org/showthread.php?t=1672679
>
> Source code on the Launchpad
> https://launchpad.net/audio-recorder
>
> Most kindly
>  Moma Antero
>  Oslo, Norway
> _______________________________________________
> 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