From 209bc955c7cae90daedc70d47d1707d907a8edb6 Mon Sep 17 00:00:00 2001 From: Frederik 'playya' Sdun Date: Sun, 15 Nov 2009 02:40:39 +0100 Subject: fsomusicd: Add Pause on calls --- fsomusicd/src/musicplayer.vala | 120 ++++++++++++++++++++++++++++++----------- 1 file changed, 90 insertions(+), 30 deletions(-) (limited to 'fsomusicd') diff --git a/fsomusicd/src/musicplayer.vala b/fsomusicd/src/musicplayer.vala index 5b758dc9..97c49868 100644 --- a/fsomusicd/src/musicplayer.vala +++ b/fsomusicd/src/musicplayer.vala @@ -1,7 +1,7 @@ /* * File Name: musicplayer.vala * Creation Date: 23-08-2009 - * Last Modified: 15-11-2009 00:59:02 + * Last Modified: 15-11-2009 02:40:18 * * Authored by Frederik 'playya' Sdun * @@ -30,9 +30,37 @@ namespace FsoMusic { public class MusicPlayer: FsoFramework.AbstractObject , FreeSmartphone.MusicPlayer { + private int _wait_counter = 0; + //Workaround to detect dec/inc. Is it possible to do this another way? + private bool waiting = false; + private int wait_counter{ default=0; get{return _wait_counter;} + set{ + _wait_counter = value; + if( _wait_counter == 1 && ! waiting ) + { + waiting = true; + if( cur_state == FreeSmartphone.MusicPlayerState.PLAYING ) + was_playing = true; + else + was_playing = false; + } + else if( _wait_counter == 0 && waiting ) + { + play(); + waiting = false; + was_playing = false; + } + } + } private bool was_playing = false; private FreeSmartphone.Device.Audio sys_audio; private Gee.ArrayList sys_sound_ids = new Gee.ArrayList(); + + private Gee.ArrayList call_pause_stati = new Gee.ArrayList(); + private Gee.ArrayList call_play_stati = new Gee.ArrayList(); + private ArrayList call_ids = new ArrayList(); + private FreeSmartphone.GSM.Call call; + private unowned KeyFile key_file; private HashTable audio_codecs; private HashTable audio_srcs; @@ -134,18 +162,13 @@ namespace FsoMusic { logger.debug( @"Open config directory $playlist_dir for playlist: $(e.message)" ); } - try - { - var con = ((FsoFramework.DBusSubsystem)subsystem).dbusConnection(); - sys_audio = con.get_object( FsoFramework.Device.ServiceDBusName, FsoFramework.Device.AudioServicePath ) - as FreeSmartphone.Device.Audio; - sys_audio.sound_status.connect( on_sys_play_sound ); - - } - catch ( DBus.Error e ) - { - logger.error( @"Gathering Device.Audio: $(e.message)" ); - } + var con = ((FsoFramework.DBusSubsystem)subsystem).dbusConnection(); + sys_audio = con.get_object( FsoFramework.Device.ServiceDBusName, FsoFramework.Device.AudioServicePath ) + as FreeSmartphone.Device.Audio; + sys_audio.sound_status.connect( on_sys_play_sound ); + call = con.get_object( FsoFramework.GSM.ServiceDBusName, FsoFramework.GSM.DeviceServicePath ) + as FreeSmartphone.GSM.Call; + call.call_status.connect( on_call_status ); } construct { @@ -157,6 +180,12 @@ namespace FsoMusic audio_srcs = new HashTable(str_hash, str_equal); setup_audio_elements(); setup_source_elements(); + foreach( var status in config.stringListValue( Config.MUSIC_PLAYER_GROUP, "pause_stati", + { "INCOMING", "OUTGOING", "ACTIVE" } ) ) + call_pause_stati.add( string_to_call_status( status ) ); + foreach( var status in config.stringListValue( Config.MUSIC_PLAYER_GROUP, "play_stati", + { "RELEASE" } ) ) + call_play_stati.add( string_to_call_status( status ) ); } ~MusicPlayer() { @@ -637,11 +666,7 @@ namespace FsoMusic { logger.error( @"Cannot remove $id from system sound IDs" ); } - else - { - if( sys_sound_ids.size == 0 && was_playing ) - play(); - } + wait_counter --; } else { @@ -649,19 +674,54 @@ namespace FsoMusic { logger.error( @"Cannot add $id to system sound IDs" ); } - else - { - if( sys_sound_ids.size == 1 ) - { - if( this.cur_state == MusicPlayerState.PLAYING ) - { - was_playing = true; - pause(); - } - else was_playing = false; - } - } + wait_counter ++; + } + } + // + // FreeSmartphone.GSM.Call callbacks + // + + private void on_call_status( int id, FreeSmartphone.GSM.CallStatus status, GLib.HashTable Properties ) + { + if( status in call_pause_stati ) + { + call_ids.add( id ); + wait_counter ++; } + else if( status in call_play_stati && call_ids.contains( id ) ) + { + call_ids.remove( id ); + wait_counter --; + } + } + // + // Helpers + // + static FreeSmartphone.GSM.CallStatus string_to_call_status( string s ) + { + FreeSmartphone.GSM.CallStatus ret = FreeSmartphone.GSM.CallStatus.INCOMING; + switch( s ) + { + case "INCOMING": + ret = FreeSmartphone.GSM.CallStatus.INCOMING; + break; + case "OUTGOING": + ret = FreeSmartphone.GSM.CallStatus.OUTGOING; + break; + case "ACTIVE": + ret = FreeSmartphone.GSM.CallStatus.ACTIVE; + break; + case "HELD": + ret = FreeSmartphone.GSM.CallStatus.HELD; + break; + case "RELEASE": + ret = FreeSmartphone.GSM.CallStatus.RELEASE; + break; + default: + FsoFramework.Logger.defaultLogger().error( @"Illegal value $s as CallStatus" ); + break; + } + return ret; } } } -- cgit v1.2.3