Search code examples
c++linuxaudiogstreamersailfish-os

Gstreamer under Sailfish OS no output sound


I am developing an audio player for Sailfish OS, and trying to play file via gstreamer, but problem: there is no sound.

I checked gstream via console:

gst-launch-0.10 filesrc location=/path/to/file.ogg ! decodebin ! autoaudiosink

And it is working fine!

I tested converting audio file to audio file:

int
main (int   argc,
      char *argv[])
{
      GstElement *pipeline;
      GstBus *bus;
      GstMessage *msg;

      gst_init (&argc, &argv);

      pipeline = gst_parse_launch ("filesrc location=/home/nemo/Music/Ringtones/Myfile.mp3 ! decodebin ! audioconvert ! vorbisenc ! oggmux ! filesink location=test.ogg", NULL);

      gst_element_set_state (pipeline, GST_STATE_PLAYING);

      bus = gst_element_get_bus (pipeline);
      msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

      if (msg != NULL)
        gst_message_unref (msg);
      gst_object_unref (bus);
      gst_element_set_state (pipeline, GST_STATE_NULL);
      gst_object_unref (pipeline);

      return 0;
}

And it is working fine!

But, when i am trying to play it, there is no sound:

pipeline = gst_parse_launch ("filesrc location=/home/nemo/Music/Ringtones/Myfile.mp3 ! decodebin ! audioconvert ! autoaudiosink", NULL);

Gstreamer version: 0.10


Solution

  • The problem was because resources need acquiring before usage:

    gst-launch is statically set as "player" in resource policy configuration, so it can be run without any extra work.

    However when you are creating your own application, you will need to acquire audio playback resources yourself.

    Check https://github.com/nemomobile/libaudioresource if you are developing C-only application or https://github.com/nemomobile/libaudioresource-qt for Qt application.

    Example:

    #include <gst/gst.h>
    #include <audioresource.h>
    #include <glib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    /*
     * Dependencies glib2-devel, libaudioresource-devel, gstreamer-devel.
     * Compile with:
     * gcc `pkg-config --cflags --libs gstreamer-0.10` `pkg-config --cflags --libs audioresource` `pkg-config --cflags --libs glib-2.0` gst-example.c -o gst-example
     *
     * Check https://github.com/nemomobile/libaudioresource
     */
    
    static GstElement *pipeline;
    static int got_reply = 0;
    
    static void on_acquired(audioresource_t *audio_resource, bool acquired, void *user_data)
    {
        got_reply = 1;
        printf("on_acquired: %s\n", acquired ? "true" : "false");
        if (acquired) {
            // start playback here
            printf("start playback\n");
            gst_element_set_state (pipeline, GST_STATE_PLAYING);
        } else {
            // stop playback here
        }
    }
    
    static void naive_wait()
    {
        got_reply = 0;
        while (!got_reply) {
            g_main_context_iteration(NULL, false);
            usleep(1000);
        }
    }
    
    int main(int   argc, char *argv[])
    {
        audioresource_t *resource;
        void *user_data = NULL;
        char tmp[1024];
        GstBus *bus;
        GstMessage *msg;
    
        if (argc < 2) {
            printf("audio file argument needed.\n");
            return 1;
        }
    
        gst_init (&argc, &argv);
    
        printf("initialize audioresource for media player\n");
        resource = audioresource_init(AUDIO_RESOURCE_MEDIA, on_acquired, user_data);
    
        snprintf(tmp, 1024, "filesrc location=%s ! decodebin ! audiocovert ! autoaudiosink", argv[1]);
        printf("create pipeline: %s\n", tmp);
        pipeline = gst_parse_launch (tmp, NULL);
    
        printf("acquire audioresource..\n");
        // When you want to start playback
        audioresource_acquire(resource);
    
        // Wait for the reply for acquire..
        naive_wait();
    
        bus = gst_element_get_bus (pipeline);
        msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
    
        if (msg != NULL)
            gst_message_unref (msg);
        gst_object_unref (bus);
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref (pipeline);
    
        printf("release audioresource..\n");
        audioresource_release(resource);
    
        // Wait for release..
        naive_wait();
    
        // When you close your application
        audioresource_free(resource);
    
        return 0;
    }
    

    Thanks to Juho Hämäläinen for an answer!