BEAST/BSE - Better Audio System and Sound Engine
0.8.2
|
00001 // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html 00002 #ifndef __BSE_PCM_DEVICE_H__ 00003 #define __BSE_PCM_DEVICE_H__ 00004 00005 #include <bse/bsedevice.hh> 00006 00007 G_BEGIN_DECLS 00008 00009 /* --- object type macros --- */ 00010 #define BSE_TYPE_PCM_DEVICE (BSE_TYPE_ID (BsePcmDevice)) 00011 #define BSE_PCM_DEVICE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_PCM_DEVICE, BsePcmDevice)) 00012 #define BSE_PCM_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_PCM_DEVICE, BsePcmDeviceClass)) 00013 #define BSE_IS_PCM_DEVICE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_PCM_DEVICE)) 00014 #define BSE_IS_PCM_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_DEVICE)) 00015 #define BSE_PCM_DEVICE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PCM_DEVICE, BsePcmDeviceClass)) 00016 00017 00018 /* --- capabilities --- */ 00019 #define BSE_PCM_FREQ_MIN BSE_PCM_FREQ_8000 00020 #define BSE_PCM_FREQ_MAX BSE_PCM_FREQ_192000 00021 typedef enum /*< skip >*/ 00022 { 00023 BSE_PCM_CMODE_MONO = 1, 00024 BSE_PCM_CMODE_STEREO 00025 } BsePcmChannelMode; 00026 00027 struct BsePcmHandle { 00028 guint readable : 1; 00029 guint writable : 1; 00030 guint n_channels; /* should be req_n_channels */ 00031 guint mix_freq; /* should be req_mix_freq within 1% tolerance */ 00032 guint block_length; /* in frames, filled in after open() before i/o */ 00033 Bse::Spinlock spinlock; 00034 gsize (*read) (BsePcmHandle *handle, 00035 gfloat *values); /* n_channels * block_length values */ 00036 void (*write) (BsePcmHandle *handle, 00037 const gfloat *values); /* n_channels * block_length values */ 00038 gboolean (*check_io) (BsePcmHandle *handle, 00039 glong *timeoutp); 00040 guint (*latency) (BsePcmHandle *handle); 00041 }; 00042 struct BsePcmDevice : BseDevice { 00043 /* requested caps */ 00044 guint req_n_channels; 00045 guint req_mix_freq; 00046 guint req_latency_ms; /* latency in milliseconds */ 00047 guint req_block_length; /* in frames, a guess at block_length after open() */ 00048 /* operational handle */ 00049 BsePcmHandle *handle; 00050 }; 00051 struct BsePcmDeviceClass : BseDeviceClass 00052 {}; 00053 00054 void bse_pcm_device_request (BsePcmDevice *pdev, 00055 guint n_channels, 00056 guint mix_freq, 00057 guint latency_ms, 00058 guint block_length); /* in frames */ 00059 guint bse_pcm_device_get_mix_freq (BsePcmDevice *pdev); 00060 BsePcmHandle* bse_pcm_device_get_handle (BsePcmDevice *pdev, 00061 guint block_length); 00062 gsize bse_pcm_handle_read (BsePcmHandle *handle, 00063 gsize n_values, 00064 gfloat *values); 00065 void bse_pcm_handle_write (BsePcmHandle *handle, 00066 gsize n_values, 00067 const gfloat *values); 00068 gboolean bse_pcm_handle_check_io (BsePcmHandle *handle, 00069 glong *timeoutp); 00070 guint bse_pcm_handle_latency (BsePcmHandle *handle); 00071 00072 00073 /* --- misc utils --- */ 00074 guint bse_pcm_device_frequency_align (gint mix_freq); 00075 00076 00077 G_END_DECLS 00078 00079 #endif /* __BSE_PCM_DEVICE_H__ */