How to detect signal level without creating a "fakesink" audio-pipeline?
Osmo Antero
osmoma at gmail.com
Sat Aug 13 04:05:56 PDT 2011
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
More information about the gstreamer-devel
mailing list