1 /* GSequencer - Advanced GTK Sequencer 2 * Copyright (C) 2005-2019 Joël Krähemann 3 * 4 * This file is part of GSequencer. 5 * 6 * GSequencer is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * GSequencer is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with GSequencer. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef __AGS_PLAYBACK_DOMAIN_H__ 21 #define __AGS_PLAYBACK_DOMAIN_H__ 22 23 #include <glib.h> 24 #include <glib-object.h> 25 26 #include <ags/libags.h> 27 28 #include <ags/audio/ags_sound_enums.h> 29 30 G_BEGIN_DECLS 31 32 #define AGS_TYPE_PLAYBACK_DOMAIN (ags_playback_domain_get_type()) 33 #define AGS_PLAYBACK_DOMAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomain)) 34 #define AGS_PLAYBACK_DOMAIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomain)) 35 #define AGS_IS_PLAYBACK_DOMAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAYBACK_DOMAIN)) 36 #define AGS_IS_PLAYBACK_DOMAIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAYBACK_DOMAIN)) 37 #define AGS_PLAYBACK_DOMAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomainClass)) 38 39 #define AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(obj) (&(((AgsPlaybackDomain *) obj)->obj_mutex)) 40 41 typedef struct _AgsPlaybackDomain AgsPlaybackDomain; 42 typedef struct _AgsPlaybackDomainClass AgsPlaybackDomainClass; 43 44 /** 45 * AgsPlaybackDomainFlags: 46 * @AGS_PLAYBACK_DOMAIN_CONNECTED: indicates the playback domain was connected by calling #AgsConnectable::connect() 47 * @AGS_PLAYBACK_DOMAIN_SINGLE_THREADED: single threaded 48 * @AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO: super threaded audio 49 * 50 * Enum values to control the behavior or indicate internal state of #AgsPlaybackDomain by 51 * enable/disable as flags. 52 */ 53 typedef enum{ 54 AGS_PLAYBACK_DOMAIN_CONNECTED = 1, 55 AGS_PLAYBACK_DOMAIN_SINGLE_THREADED = 1 << 1, 56 AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO = 1 << 2, 57 }AgsPlaybackDomainFlags; 58 59 struct _AgsPlaybackDomain 60 { 61 GObject gobject; 62 63 guint flags; 64 65 GRecMutex obj_mutex; 66 67 GObject *audio; 68 69 AgsThread **audio_thread; 70 71 GList *output_playback; 72 GList *input_playback; 73 }; 74 75 struct _AgsPlaybackDomainClass 76 { 77 GObjectClass gobject; 78 }; 79 80 GType ags_playback_domain_get_type(); 81 82 gboolean ags_playback_domain_test_flags(AgsPlaybackDomain *playback_domain, guint flags); 83 void ags_playback_domain_set_flags(AgsPlaybackDomain *playback_domain, guint flags); 84 void ags_playback_domain_unset_flags(AgsPlaybackDomain *playback_domain, guint flags); 85 86 /* get and set */ 87 void ags_playback_domain_set_audio_thread(AgsPlaybackDomain *playback_domain, 88 AgsThread *thread, 89 gint sound_scope); 90 AgsThread* ags_playback_domain_get_audio_thread(AgsPlaybackDomain *playback_domain, 91 gint sound_scope); 92 93 /* add and remove */ 94 void ags_playback_domain_add_playback(AgsPlaybackDomain *playback_domain, 95 GObject *playback, GType channel_type); 96 void ags_playback_domain_insert_playback(AgsPlaybackDomain *playback_domain, 97 GObject *playback, GType channel_type, 98 gint position); 99 void ags_playback_domain_remove_playback(AgsPlaybackDomain *playback_domain, 100 GObject *playback, GType channel_type); 101 102 /* instance */ 103 AgsPlaybackDomain* ags_playback_domain_new(GObject *audio); 104 105 G_END_DECLS 106 107 #endif /*__AGS_PLAYBACK_DOMAIN_H__*/ 108