BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
bsepcmdevice.hh
Go to the documentation of this file.
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__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines