1 /* GSequencer - Advanced GTK Sequencer 2 * Copyright (C) 2005-2020 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_SOUNDCARD_H__ 21 #define __AGS_SOUNDCARD_H__ 22 23 #include <glib.h> 24 #include <glib-object.h> 25 26 G_BEGIN_DECLS 27 28 #define AGS_TYPE_SOUNDCARD (ags_soundcard_get_type()) 29 #define AGS_TYPE_SOUNDCARD_FORMAT (ags_soundcard_format_get_type()) 30 #define AGS_TYPE_SOUNDCARD_CAPABILITY (ags_soundcard_capability_get_type()) 31 #define AGS_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUNDCARD, AgsSoundcard)) 32 #define AGS_SOUNDCARD_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUNDCARD, AgsSoundcardInterface)) 33 #define AGS_IS_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUNDCARD)) 34 #define AGS_IS_SOUNDCARD_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUNDCARD)) 35 #define AGS_SOUNDCARD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUNDCARD, AgsSoundcardInterface)) 36 37 #define AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS (2) 38 #define AGS_SOUNDCARD_MIN_DSP_CHANNELS (1) 39 #define AGS_SOUNDCARD_MAX_DSP_CHANNELS (64) 40 41 #define AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS (2) 42 #define AGS_SOUNDCARD_MIN_PCM_CHANNELS (1) 43 #define AGS_SOUNDCARD_MAX_PCM_CHANNELS (64) 44 45 #define AGS_SOUNDCARD_DEFAULT_SAMPLERATE (48000.0) 46 #define AGS_SOUNDCARD_MIN_SAMPLERATE (8000.0) 47 #define AGS_SOUNDCARD_MAX_SAMPLERATE (5644800.0) 48 49 #define AGS_SOUNDCARD_DEFAULT_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) 50 51 #define AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE (1024) 52 #define AGS_SOUNDCARD_MIN_BUFFER_SIZE (16) 53 #define AGS_SOUNDCARD_MAX_BUFFER_SIZE (16384) 54 55 #define AGS_SOUNDCARD_DEFAULT_BPM (120.0) 56 #define AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR (1.0 / 4.0) 57 #define AGS_SOUNDCARD_DEFAULT_JIFFIE ((double) AGS_SOUNDCARD_DEFAULT_SAMPLERATE / (double) AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) 58 59 #define AGS_SOUNDCARD_DEFAULT_TACT (1.0 / 1.0) 60 #define AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE (60.0 / AGS_SOUNDCARD_DEFAULT_BPM * AGS_SOUNDCARD_DEFAULT_TACT) 61 #define AGS_SOUNDCARD_DEFAULT_TACTRATE (1.0 / AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE) 62 63 #define AGS_SOUNDCARD_DEFAULT_SCALE (1.0) 64 #define AGS_SOUNDCARD_DEFAULT_DELAY ((60.0 * ((AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) / AGS_SOUNDCARD_DEFAULT_BPM)) * ((1.0 / 16.0) * (1.0 / AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR))) 65 66 #define AGS_SOUNDCARD_DEFAULT_PERIOD (2048.0) 67 68 #define AGS_SOUNDCARD_DEFAULT_LOOP_LEFT (0) 69 #define AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT (64) 70 71 #ifdef __APPLE__ 72 #define AGS_SOUNDCARD_DEFAULT_OVERCLOCK (2.0) 73 #else 74 #define AGS_SOUNDCARD_DEFAULT_OVERCLOCK (0.0) 75 #endif 76 77 #define AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT (8) 78 79 typedef struct _AgsSoundcard AgsSoundcard; 80 typedef struct _AgsSoundcardInterface AgsSoundcardInterface; 81 82 /** 83 * AgsSoundcardFormat: 84 * @AGS_SOUNDCARD_SIGNED_8_BIT: signed 8 bit raw pcm data 85 * @AGS_SOUNDCARD_SIGNED_16_BIT: signed 16 bit raw pcm data 86 * @AGS_SOUNDCARD_SIGNED_24_BIT: signed 24 bit raw pcm data 87 * @AGS_SOUNDCARD_SIGNED_32_BIT: signed 32 bit raw pcm data 88 * @AGS_SOUNDCARD_SIGNED_64_BIT: signed 64 bit raw pcm data 89 * @AGS_SOUNDCARD_FLOAT: float raw pcm data 90 * @AGS_SOUNDCARD_DOUBLE: double raw pcm data 91 * @AGS_SOUNDCARD_COMPLEX: complex audio data 92 * 93 * #AgsSoundcardFormat specifies the audio data representation to be used. 94 */ 95 typedef enum{ 96 AGS_SOUNDCARD_SIGNED_8_BIT = 0x8, 97 AGS_SOUNDCARD_SIGNED_16_BIT = 0x10, 98 AGS_SOUNDCARD_SIGNED_24_BIT = 0x18, 99 AGS_SOUNDCARD_SIGNED_32_BIT = 0x20, 100 AGS_SOUNDCARD_SIGNED_64_BIT = 0x40, 101 AGS_SOUNDCARD_FLOAT = 0xfffffff0, 102 AGS_SOUNDCARD_DOUBLE = 0xfffffff1, 103 AGS_SOUNDCARD_COMPLEX = 0xfffffff8, 104 }AgsSoundcardFormat; 105 106 /** 107 * AgsSoundcardCapability: 108 * @AGS_SOUNDCARD_CAPABILITY_PLAYBACK: capability playback 109 * @AGS_SOUNDCARD_CAPABILITY_CAPTURE: capability capture 110 * @AGS_SOUNDCARD_CAPABILITY_DUPLEX: capability duplex 111 * 112 * Enum values to tell about capability. 113 */ 114 typedef enum{ 115 AGS_SOUNDCARD_CAPABILITY_PLAYBACK = 1, 116 AGS_SOUNDCARD_CAPABILITY_CAPTURE = 1 << 1, 117 AGS_SOUNDCARD_CAPABILITY_DUPLEX = 1 << 2, 118 }AgsSoundcardCapability; 119 120 struct _AgsSoundcardInterface 121 { 122 GTypeInterface ginterface; 123 124 void (*set_device)(AgsSoundcard *soundcard, 125 gchar *card_id); 126 gchar* (*get_device)(AgsSoundcard *soundcard); 127 128 void (*pcm_info)(AgsSoundcard *soundcard, gchar *card_id, 129 guint *channels_min, guint *channels_max, 130 guint *rate_min, guint *rate_max, 131 guint *buffer_size_min, guint *buffer_size_max, 132 GError **error); 133 134 guint (*get_capability)(AgsSoundcard *soundcard); 135 136 void (*set_presets)(AgsSoundcard *soundcard, 137 guint channels, 138 guint rate, 139 guint buffer_size, 140 guint format); 141 void (*get_presets)(AgsSoundcard *soundcard, 142 guint *channels, 143 guint *rate, 144 guint *buffer_size, 145 guint *format); 146 147 void (*list_cards)(AgsSoundcard *soundcard, 148 GList **card_id, GList **card_name); 149 150 gboolean (*is_available)(AgsSoundcard *soundcard); 151 152 gboolean (*is_starting)(AgsSoundcard *soundcard); 153 gboolean (*is_playing)(AgsSoundcard *soundcard); 154 gboolean (*is_recording)(AgsSoundcard *soundcard); 155 156 gchar* (*get_uptime)(AgsSoundcard *soundcard); 157 158 void (*play_init)(AgsSoundcard *soundcard, 159 GError **error); 160 void (*play)(AgsSoundcard *soundcard, 161 GError **error); 162 163 void (*record_init)(AgsSoundcard *soundcard, 164 GError **error); 165 void (*record)(AgsSoundcard *soundcard, 166 GError **error); 167 168 void (*stop)(AgsSoundcard *soundcard); 169 170 void (*tic)(AgsSoundcard *soundcard); 171 void (*offset_changed)(AgsSoundcard *soundcard, 172 guint note_offset); 173 174 void* (*get_buffer)(AgsSoundcard *soundcard); 175 void* (*get_next_buffer)(AgsSoundcard *soundcard); 176 void* (*get_prev_buffer)(AgsSoundcard *soundcard); 177 178 void (*lock_buffer)(AgsSoundcard *soundcard, 179 void *buffer); 180 void (*unlock_buffer)(AgsSoundcard *soundcard, 181 void *buffer); 182 183 void (*set_bpm)(AgsSoundcard *soundcard, 184 gdouble bpm); 185 gdouble (*get_bpm)(AgsSoundcard *soundcard); 186 187 void (*set_delay_factor)(AgsSoundcard *soundcard, 188 gdouble delay_factor); 189 gdouble (*get_delay_factor)(AgsSoundcard *soundcard); 190 191 gdouble (*get_absolute_delay)(AgsSoundcard *soundcard); 192 193 gdouble (*get_delay)(AgsSoundcard *soundcard); 194 guint (*get_attack)(AgsSoundcard *soundcard); 195 196 guint (*get_delay_counter)(AgsSoundcard *soundcard); 197 198 void (*set_start_note_offset)(AgsSoundcard *soundcard, 199 guint start_note_offset); 200 guint (*get_start_note_offset)(AgsSoundcard *soundcard); 201 202 void (*set_note_offset)(AgsSoundcard *soundcard, 203 guint note_offset); 204 guint (*get_note_offset)(AgsSoundcard *soundcard); 205 206 void (*set_note_offset_absolute)(AgsSoundcard *soundcard, 207 guint note_offset); 208 guint (*get_note_offset_absolute)(AgsSoundcard *soundcard); 209 210 void (*set_loop)(AgsSoundcard *soundcard, 211 guint loop_left, guint loop_right, 212 gboolean do_loop); 213 void (*get_loop)(AgsSoundcard *soundcard, 214 guint *loop_left, guint *loop_right, 215 gboolean *do_loop); 216 217 guint (*get_loop_offset)(AgsSoundcard *soundcard); 218 219 guint (*get_sub_block_count)(AgsSoundcard *soundcard); 220 221 gboolean (*trylock_sub_block)(AgsSoundcard *soundcard, 222 void *buffer, guint sub_block); 223 void (*unlock_sub_block)(AgsSoundcard *soundcard, 224 void *buffer, guint sub_block); 225 }; 226 227 GType ags_soundcard_get_type(); 228 GType ags_soundcard_format_get_type(); 229 GType ags_soundcard_capability_get_type(); 230 231 void ags_soundcard_set_device(AgsSoundcard *soundcard, 232 gchar *card_id); 233 gchar* ags_soundcard_get_device(AgsSoundcard *soundcard); 234 235 void ags_soundcard_set_presets(AgsSoundcard *soundcard, 236 guint channels, 237 guint rate, 238 guint buffer_size, 239 guint format); 240 void ags_soundcard_get_presets(AgsSoundcard *soundcard, 241 guint *channels, 242 guint *rate, 243 guint *buffer_size, 244 guint *format); 245 246 void ags_soundcard_list_cards(AgsSoundcard *soundcard, 247 GList **card_id, GList **card_name); 248 void ags_soundcard_pcm_info(AgsSoundcard *soundcard, gchar *card_id, 249 guint *channels_min, guint *channels_max, 250 guint *rate_min, guint *rate_max, 251 guint *buffer_size_min, guint *buffer_size_max, 252 GError **error); 253 254 guint ags_soundcard_get_capability(AgsSoundcard *soundcard); 255 256 gboolean ags_soundcard_is_available(AgsSoundcard *soundcard); 257 258 gboolean ags_soundcard_is_starting(AgsSoundcard *soundcard); 259 gboolean ags_soundcard_is_playing(AgsSoundcard *soundcard); 260 gboolean ags_soundcard_is_recording(AgsSoundcard *soundcard); 261 262 gchar* ags_soundcard_get_uptime(AgsSoundcard *soundcard); 263 264 void ags_soundcard_play_init(AgsSoundcard *soundcard, 265 GError **error); 266 void ags_soundcard_play(AgsSoundcard *soundcard, 267 GError **error); 268 269 void ags_soundcard_record_init(AgsSoundcard *soundcard, 270 GError **error); 271 void ags_soundcard_record(AgsSoundcard *soundcard, 272 GError **error); 273 274 void ags_soundcard_stop(AgsSoundcard *soundcard); 275 276 void ags_soundcard_tic(AgsSoundcard *soundcard); 277 void ags_soundcard_offset_changed(AgsSoundcard *soundcard, 278 guint note_offset); 279 280 void* ags_soundcard_get_buffer(AgsSoundcard *soundcard); 281 void* ags_soundcard_get_next_buffer(AgsSoundcard *soundcard); 282 void* ags_soundcard_get_prev_buffer(AgsSoundcard *soundcard); 283 284 void ags_soundcard_lock_buffer(AgsSoundcard *soundcard, 285 void *buffer); 286 void ags_soundcard_unlock_buffer(AgsSoundcard *soundcard, 287 void *buffer); 288 289 void ags_soundcard_set_bpm(AgsSoundcard *soundcard, 290 gdouble bpm); 291 gdouble ags_soundcard_get_bpm(AgsSoundcard *soundcard); 292 293 void ags_soundcard_set_delay_factor(AgsSoundcard *soundcard, 294 gdouble delay_factor); 295 gdouble ags_soundcard_get_delay_factor(AgsSoundcard *soundcard); 296 297 gdouble ags_soundcard_get_absolute_delay(AgsSoundcard *soundcard); 298 299 gdouble ags_soundcard_get_delay(AgsSoundcard *soundcard); 300 guint ags_soundcard_get_attack(AgsSoundcard *soundcard); 301 302 guint ags_soundcard_get_delay_counter(AgsSoundcard *soundcard); 303 304 void ags_soundcard_set_start_note_offset(AgsSoundcard *soundcard, 305 guint start_note_offset); 306 guint ags_soundcard_get_start_note_offset(AgsSoundcard *soundcard); 307 308 void ags_soundcard_set_note_offset(AgsSoundcard *soundcard, 309 guint note_offset); 310 guint ags_soundcard_get_note_offset(AgsSoundcard *soundcard); 311 312 void ags_soundcard_set_note_offset_absolute(AgsSoundcard *soundcard, 313 guint note_offset); 314 guint ags_soundcard_get_note_offset_absolute(AgsSoundcard *soundcard); 315 316 void ags_soundcard_set_loop(AgsSoundcard *soundcard, 317 guint loop_left, guint loop_right, 318 gboolean do_loop); 319 void ags_soundcard_get_loop(AgsSoundcard *soundcard, 320 guint *loop_left, guint *loop_right, 321 gboolean *do_loop); 322 323 guint ags_soundcard_get_loop_offset(AgsSoundcard *soundcard); 324 325 guint ags_soundcard_get_sub_block_count(AgsSoundcard *soundcard); 326 327 gboolean ags_soundcard_trylock_sub_block(AgsSoundcard *soundcard, 328 void *buffer, guint sub_block); 329 void ags_soundcard_unlock_sub_block(AgsSoundcard *soundcard, 330 void *buffer, guint sub_block); 331 332 G_END_DECLS 333 334 #endif /*__AGS_SOUNDCARD_H__*/ 335