gst_plugins_base/ext/alsa/gstalsamixer.h
branchRCL_3
changeset 29 567bb019e3e3
parent 6 9b2c3c7a1a9c
child 30 7e817e7e631c
equal deleted inserted replaced
6:9b2c3c7a1a9c 29:567bb019e3e3
     1 /* ALSA mixer interface implementation.
       
     2  * Copyright (C) 2003 Leif Johnson <leif@ambient.2y.net>
       
     3  *
       
     4  * This library is free software; you can redistribute it and/or
       
     5  * modify it under the terms of the GNU Library General Public
       
     6  * License as published by the Free Software Foundation; either
       
     7  * version 2 of the License, or (at your option) any later version.
       
     8  *
       
     9  * This library is distributed in the hope that it will be useful,
       
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
       
    12  * Library General Public License for more details.
       
    13  *
       
    14  * You should have received a copy of the GNU Library General Public
       
    15  * License along with this library; if not, write to the Free
       
    16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
       
    17  */
       
    18 
       
    19 
       
    20 #ifndef __GST_ALSA_MIXER_H__
       
    21 #define __GST_ALSA_MIXER_H__
       
    22 
       
    23 
       
    24 #include "gstalsa.h"
       
    25 
       
    26 #include <gst/interfaces/mixer.h>
       
    27 #include "gstalsamixeroptions.h"
       
    28 #include "gstalsamixertrack.h"
       
    29 
       
    30 
       
    31 G_BEGIN_DECLS
       
    32 
       
    33 /* This does not get you what you think it does, use obj->mixer   */
       
    34 /* #define GST_ALSA_MIXER(obj)             ((GstAlsaMixer*)(obj)) */
       
    35 
       
    36 typedef struct _GstAlsaMixer GstAlsaMixer;
       
    37 
       
    38 typedef enum {
       
    39   GST_ALSA_MIXER_CAPTURE = 1<<0,
       
    40   GST_ALSA_MIXER_PLAYBACK = 1<<1,
       
    41   GST_ALSA_MIXER_ALL = GST_ALSA_MIXER_CAPTURE | GST_ALSA_MIXER_PLAYBACK
       
    42 } GstAlsaMixerDirection;
       
    43 
       
    44 /**
       
    45  * GstAlsaMixer:
       
    46  *
       
    47  * Opaque data structure
       
    48  */
       
    49 struct _GstAlsaMixer
       
    50 {
       
    51   GList *               tracklist;      /* list of available tracks */
       
    52 
       
    53   snd_mixer_t *         handle;
       
    54 
       
    55   GstTask *		task;
       
    56   GStaticRecMutex *	task_mutex;
       
    57   GStaticRecMutex *	rec_mutex;
       
    58 
       
    59   int			pfd[2];
       
    60 
       
    61   GstMixer *		interface;
       
    62   gchar *               device;
       
    63   gchar *               cardname;
       
    64 
       
    65   GstAlsaMixerDirection dir;
       
    66 };
       
    67 
       
    68 
       
    69 GstAlsaMixer*   gst_alsa_mixer_new              (const gchar *device,
       
    70                                                  GstAlsaMixerDirection dir);
       
    71 void            gst_alsa_mixer_free             (GstAlsaMixer *mixer);
       
    72 
       
    73 const GList*    gst_alsa_mixer_list_tracks      (GstAlsaMixer * mixer);
       
    74 void            gst_alsa_mixer_set_volume       (GstAlsaMixer * mixer,
       
    75                                                  GstMixerTrack * track,
       
    76                                                  gint * volumes);
       
    77 void            gst_alsa_mixer_get_volume       (GstAlsaMixer * mixer,
       
    78                                                  GstMixerTrack * track,
       
    79                                                  gint * volumes);
       
    80 void            gst_alsa_mixer_set_record       (GstAlsaMixer * mixer,
       
    81                                                  GstMixerTrack * track,
       
    82                                                  gboolean record);
       
    83 void            gst_alsa_mixer_set_mute         (GstAlsaMixer * mixer,
       
    84                                                  GstMixerTrack * track,
       
    85                                                  gboolean mute);
       
    86 void            gst_alsa_mixer_set_option       (GstAlsaMixer * mixer,
       
    87                                                  GstMixerOptions * opts,
       
    88                                                  gchar * value);
       
    89 const gchar*    gst_alsa_mixer_get_option       (GstAlsaMixer * mixer,
       
    90                                                  GstMixerOptions * opts);
       
    91 void		_gst_alsa_mixer_set_interface   (GstAlsaMixer * mixer,
       
    92 						 GstMixer * interface);
       
    93 GstMixerFlags   gst_alsa_mixer_get_mixer_flags  (GstAlsaMixer *mixer);
       
    94 
       
    95 #define GST_IMPLEMENT_ALSA_MIXER_METHODS(Type, interface_as_function)           \
       
    96 static gboolean                                                                 \
       
    97 interface_as_function ## _supported (Type *this, GType iface_type)              \
       
    98 {                                                                               \
       
    99   g_assert (iface_type == GST_TYPE_MIXER);                                      \
       
   100                                                                                 \
       
   101   return (this->mixer != NULL);                                                 \
       
   102 }                                                                               \
       
   103                                                                                 \
       
   104 static const GList*                                                             \
       
   105 interface_as_function ## _list_tracks (GstMixer * mixer)                        \
       
   106 {                                                                               \
       
   107   Type *this = (Type*) mixer;                                                   \
       
   108                                                                                 \
       
   109   g_return_val_if_fail (this != NULL, NULL);                                    \
       
   110   g_return_val_if_fail (this->mixer != NULL, NULL);                             \
       
   111                                                                                 \
       
   112   return gst_alsa_mixer_list_tracks (this->mixer);                              \
       
   113 }                                                                               \
       
   114                                                                                 \
       
   115 static void                                                                     \
       
   116 interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track,  \
       
   117     gint * volumes)                                                             \
       
   118 {                                                                               \
       
   119   Type *this = (Type*) mixer;                                                   \
       
   120                                                                                 \
       
   121   g_return_if_fail (this != NULL);                                              \
       
   122   g_return_if_fail (this->mixer != NULL);                                       \
       
   123                                                                                 \
       
   124   gst_alsa_mixer_set_volume (this->mixer, track, volumes);                      \
       
   125 }                                                                               \
       
   126                                                                                 \
       
   127 static void                                                                     \
       
   128 interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track,  \
       
   129     gint * volumes)                                                             \
       
   130 {                                                                               \
       
   131   Type *this = (Type*) mixer;                                                   \
       
   132                                                                                 \
       
   133   g_return_if_fail (this != NULL);                                              \
       
   134   g_return_if_fail (this->mixer != NULL);                                       \
       
   135                                                                                 \
       
   136   gst_alsa_mixer_get_volume (this->mixer, track, volumes);                      \
       
   137 }                                                                               \
       
   138                                                                                 \
       
   139 static void                                                                     \
       
   140 interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track,  \
       
   141     gboolean record)                                                            \
       
   142 {                                                                               \
       
   143   Type *this = (Type*) mixer;                                                   \
       
   144                                                                                 \
       
   145   g_return_if_fail (this != NULL);                                              \
       
   146   g_return_if_fail (this->mixer != NULL);                                       \
       
   147                                                                                 \
       
   148   gst_alsa_mixer_set_record (this->mixer, track, record);                       \
       
   149 }                                                                               \
       
   150                                                                                 \
       
   151 static void                                                                     \
       
   152 interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track,    \
       
   153     gboolean mute)                                                              \
       
   154 {                                                                               \
       
   155   Type *this = (Type*) mixer;                                                   \
       
   156                                                                                 \
       
   157   g_return_if_fail (this != NULL);                                              \
       
   158   g_return_if_fail (this->mixer != NULL);                                       \
       
   159                                                                                 \
       
   160   gst_alsa_mixer_set_mute (this->mixer, track, mute);                           \
       
   161 }                                                                               \
       
   162                                                                                 \
       
   163 static void                                                                     \
       
   164 interface_as_function ## _set_option (GstMixer * mixer, GstMixerOptions * opts, \
       
   165     gchar * value)                                                              \
       
   166 {                                                                               \
       
   167   Type *this = (Type*) mixer;                                                   \
       
   168                                                                                 \
       
   169   g_return_if_fail (this != NULL);                                              \
       
   170   g_return_if_fail (this->mixer != NULL);                                       \
       
   171                                                                                 \
       
   172   gst_alsa_mixer_set_option (this->mixer, opts, value);                         \
       
   173 }                                                                               \
       
   174                                                                                 \
       
   175 static const gchar*                                                             \
       
   176 interface_as_function ## _get_option (GstMixer * mixer, GstMixerOptions * opts) \
       
   177 {                                                                               \
       
   178   Type *this = (Type*) mixer;                                                   \
       
   179                                                                                 \
       
   180   g_return_val_if_fail (this != NULL, NULL);                                    \
       
   181   g_return_val_if_fail (this->mixer != NULL, NULL);                             \
       
   182                                                                                 \
       
   183   return gst_alsa_mixer_get_option (this->mixer, opts);                         \
       
   184 }                                                                               \
       
   185                                                                                 \
       
   186 static GstMixerFlags                                                            \
       
   187 interface_as_function ## _get_mixer_flags (GstMixer * mixer)                    \
       
   188 {                                                                               \
       
   189   Type *this = (Type*) mixer;                                                   \
       
   190                                                                                 \
       
   191   g_return_val_if_fail (this != NULL, GST_MIXER_FLAG_NONE);                     \
       
   192   g_return_val_if_fail (this->mixer != NULL, GST_MIXER_FLAG_NONE);              \
       
   193                                                                                 \
       
   194   return gst_alsa_mixer_get_mixer_flags (this->mixer);                          \
       
   195 }                                                                               \
       
   196                                                                                 \
       
   197 static void                                                                     \
       
   198 interface_as_function ## _interface_init (GstMixerClass * klass)                \
       
   199 {                                                                               \
       
   200   GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE;                                  \
       
   201                                                                                 \
       
   202   /* set up the interface hooks */                                              \
       
   203   klass->list_tracks = interface_as_function ## _list_tracks;                   \
       
   204   klass->set_volume = interface_as_function ## _set_volume;                     \
       
   205   klass->get_volume = interface_as_function ## _get_volume;                     \
       
   206   klass->set_mute = interface_as_function ## _set_mute;                         \
       
   207   klass->set_record = interface_as_function ## _set_record;                     \
       
   208   klass->set_option = interface_as_function ## _set_option;                     \
       
   209   klass->get_option = interface_as_function ## _get_option;                     \
       
   210   klass->get_mixer_flags = interface_as_function ## _get_mixer_flags;           \
       
   211 }
       
   212 
       
   213 
       
   214 G_END_DECLS
       
   215 
       
   216 
       
   217 #endif /* __GST_ALSA_MIXER_H__ */