]> ToastFreeware Gitweb - gregoa/zavai.git/blobdiff - src/audio.vala
Notes about remotising devices
[gregoa/zavai.git] / src / audio.vala
index 4cc37f444373b25e1a02e28fd810ab7543eed578..1c3942012a0747a8a0b71e6a31b096e869bb6fb4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * audio - audio resource for zavai
  *
- * Copyright (C) 2009  Enrico Zini <enrico@enricozini.org>
+ * Copyright (C) 2009--2010  Enrico Zini <enrico@enricozini.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,41 +25,200 @@ namespace audio {
 
 public class Audio: zavai.Service
 {
-       protected dynamic DBus.Object audiodev;
-       protected dynamic DBus.Object vibdev;
-
-       public Audio()
-       {
-               name = "audio";
-               audiodev = zavai.registry.sbus.get_object(
-                       "org.freesmartphone.odeviced",
-                       "/org/freesmartphone/Device/Audio",
-                       "org.freesmartphone.Device.Audio");
+    protected Omhacks.Led vibrator;
+    protected bool has_vibrator;
+
+    /*
+       protected dynamic DBus.Object audiodev;
+       protected dynamic DBus.Object vibdev;
+   */
+
+    public Audio()
+    {
+        Object(name: "audio");
+
+        has_vibrator = (vibrator.init("neo1973:vibrator") == 0);
+
+/*
+        audiodev = zavai.registry.sbus.get_object(
+                "org.freesmartphone.odeviced",
+                "/org/freesmartphone/Device/Audio",
+                "org.freesmartphone.Device.Audio");
         vibdev = zavai.registry.sbus.get_object(
-                       "org.freesmartphone.odeviced",
-                       "/org/freesmartphone/Device/LED/neo1973_vibrator",
-                       "org.freesmartphone.Device.LED");
-       }
+                "org.freesmartphone.odeviced",
+                "/org/freesmartphone/Device/LED/neo1973_vibrator",
+                "org.freesmartphone.Device.LED");
+*/
+        clock.alarm_trigger_queue.triggered += on_alarm_trigger;
+        clock.alarm_trigger_queue.acked += on_alarm_done;
+        clock.alarm_trigger_queue.canceled += on_alarm_done;
+    }
+
+    public void on_alarm_trigger(clock.AlarmTriggerInfo info)
+    {
+        zavai.log.debug("Make noise for alarm");
+        if (has_vibrator)
+        {
+            vibrator.brightness = 256;
+            // FIXME: is there a better way? I hope there is a better way. Please
+            // tell me there is a better way.
+            var trig = "timer";
+            for (int i = 0; ; ++i)
+            {
+                vibrator.trigger[i] = (char)trig[i];
+                if (trig[i] == 0) break;
+            }
+            vibrator.delay_on = 200;
+            vibrator.delay_off = 300;
+            vibrator.set();
+        }
+        soundplayer.play(config.ringtone_alarm, true);
+    }
+
+    public void on_alarm_done(clock.AlarmTriggerInfo info)
+    {
+        zavai.log.debug("Stop noise for alarm");
+        if (has_vibrator)
+        {
+            var trig = "none";
+            for (int i = 0; ; ++i)
+            {
+                vibrator.trigger[i] = (char)trig[i];
+                if (trig[i] == 0) break;
+            }
+            vibrator.brightness = 0;
+            vibrator.set();
+        }
+        soundplayer.stop();
+    }
 
+/*
     public void notify_alarm(zavai.clock.Alarm a)
     {
         // Wiggle screen to turn on backlight
         zavai.ui.power.backlight.wiggle();
         try {
-            vibdev.BlinkSeconds(2, 500, 200);
+            // Method does not exist in this frameworkd
+            vibdev.BlinkSeconds(5, 500, 200);
         } catch (Error e) {
             zavai.log.error("Cannot blink vibrator: " + e.message);
         }
+        // TODO: play music?
+    }
+*/
+}
+
+public class Player: zavai.Resource, Object
+{
+    protected Gst.Element player;
+    protected bool playing;
+    protected Player slave;
+    protected Player master;
+    protected bool loop;
+    protected string uri;
+    public signal void state_changed(Gst.State new_state);
+
+    public Player()
+    {
+        slave = null;
+        master = null;
+        player = Gst.ElementFactory.make("playbin", null);
+        playing = false;
+        loop = false;
+        var bus = player.get_bus();
+        bus.add_signal_watch();
+        bus.message += on_message;
+    }
+
+    public void set_slave(Player player)
+    {
+        slave = player;
+        slave.master = this;
+    }
+
+    public void play(string uri, bool loop = false)
+    {
+stderr.printf("Playing %s\n", uri);
+        this.uri = uri;
+
+        if (slave != null && slave.playing)
+            slave.pause();
+
+        player.set_property("uri", uri);
+        player.set_state(master != null && master.playing ? Gst.State.PAUSED : Gst.State.PLAYING);
+        playing = true;
+        this.loop = loop;
+    }
+
+    public Gst.State get_state()
+    {
+        Gst.State state;
+        Gst.State pending;
+
+        player.get_state(out state, out pending, (Gst.ClockType)Gst.CLOCK_TIME_NONE);
+
+        return state;
+    }
+
+    public void pause()
+    {
+        player.set_state(Gst.State.PAUSED);
+        state_changed(Gst.State.PAUSED);
+    }
+
+    public void resume()
+    {
+        player.set_state(Gst.State.PLAYING);
+        state_changed(Gst.State.PLAYING);
+    }
+
+    public void restart()
+    {
+        player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0);
+        player.set_state(Gst.State.PLAYING);
+        state_changed(Gst.State.PLAYING);
+    }
+
+    public void stop()
+    {
+        playing = false;
+        player.set_state(Gst.State.NULL);
+        state_changed(Gst.State.NULL);
+
+        // Resume slave after we are done
+        if (slave != null && slave.playing)
+            slave.resume();
+    }
+
+    protected void on_message(Gst.Message message)
+    {
+        if (message.type == Gst.MessageType.EOS)
+        {
+            if (loop)
+                restart();
+            else
+                stop();
+        }
+    }
+
+    public void shutdown()
+    {
+        stop();
     }
 }
 
 public Audio audio = null;
+public Player musicplayer = null;
+public Player soundplayer = null;
 
 public void init()
 {
     audio = new Audio();
-
-       zavai.registry.register_service(audio);
+    musicplayer = new Player();
+    soundplayer = new Player();
+    soundplayer.set_slave(musicplayer);
+    zavai.registry.register(musicplayer);
+    zavai.registry.register(soundplayer);
 }
 
 }