Changeset 2073:9032ae5f36c7 in roaraudio for plugins/gstreamer0.10


Ignore:
Timestamp:
07/19/09 04:01:35 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

copyed a lot code from the oss mixer

Location:
plugins/gstreamer0.10
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • plugins/gstreamer0.10/gstroar.c

    r1600 r2073  
    2626#endif 
    2727#include "roarsink.h" 
     28#include "roarmixer.h" 
    2829 
    2930//#include "gst/gst-i18n-plugin.h" 
     
    3334{ 
    3435  if (!gst_roarsink_factory_init (plugin)) 
     36    return FALSE; 
     37  if (!gst_roarmixer_factory_init (plugin)) 
    3538    return FALSE; 
    3639 
  • plugins/gstreamer0.10/roarmixer.c

    r2072 r2073  
    2727#include "roarmixer.h" 
    2828 
     29GST_DEBUG_CATEGORY_EXTERN (roar_debug); 
     30#define GST_CAT_DEFAULT roar_debug 
     31 
     32enum 
     33{ 
     34  PROP_DEVICE_NAME = 1 
     35}; 
     36 
     37 
     38static const GstElementDetails gst_roar_mixer_element_details = 
     39GST_ELEMENT_DETAILS ("RoarAudio Mixer", 
     40    "Generic/Audio", 
     41    "Control sound input and output levels with RoarAudio", 
     42    "Philipp 'ph3-der-loewe' Schafft <lion@lion.leolix.org>"); 
     43 
     44GST_BOILERPLATE_WITH_INTERFACE (GstRoarMixerElement, gst_roar_mixer_element, 
     45    GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, 
     46    gst_roar_mixer_element); 
     47 
     48GST_IMPLEMENT_ROAR_MIXER_METHODS (GstRoarMixerElement, gst_roar_mixer_element); 
     49 
     50static GstStateChangeReturn gst_roar_mixer_element_change_state (GstElement * 
     51    element, GstStateChange transition); 
     52 
     53static void gst_roar_mixer_element_get_property (GObject * object, 
     54    guint prop_id, GValue * value, GParamSpec * pspec); 
     55 
     56static void 
     57gst_roar_mixer_element_base_init (gpointer klass) 
     58{ 
     59  gst_element_class_set_details (GST_ELEMENT_CLASS (klass), 
     60      &gst_roar_mixer_element_details); 
     61} 
     62 
     63static void 
     64gst_roar_mixer_element_class_init (GstRoarMixerElementClass * klass) 
     65{ 
     66  GstElementClass *element_class; 
     67  GObjectClass *gobject_class; 
     68 
     69  element_class = (GstElementClass *) klass; 
     70  gobject_class = (GObjectClass *) klass; 
     71 
     72  gobject_class->get_property = gst_roar_mixer_element_get_property; 
     73 
     74  g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, 
     75      g_param_spec_string ("device-name", "Device name", 
     76          "Human-readable name of the sound device", "", G_PARAM_READABLE)); 
     77 
     78  element_class->change_state = 
     79      GST_DEBUG_FUNCPTR (gst_roar_mixer_element_change_state); 
     80} 
     81 
     82static void 
     83gst_roar_mixer_element_init (GstRoarMixerElement * this, 
     84    GstRoarMixerElementClass * g_class) 
     85{ 
     86  this->mixer = NULL; 
     87} 
     88 
     89static void 
     90gst_roar_mixer_element_get_property (GObject * object, guint prop_id, 
     91    GValue * value, GParamSpec * pspec) 
     92{ 
     93  GstRoarMixerElement *this = GST_ROAR_MIXER_ELEMENT (object); 
     94 
     95  switch (prop_id) { 
     96    case PROP_DEVICE_NAME: 
     97      if (this->mixer) { 
     98        g_value_set_string (value, this->mixer->cardname); 
     99      } else { 
     100        g_value_set_string (value, NULL); 
     101      } 
     102      break; 
     103    default: 
     104      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 
     105      break; 
     106  } 
     107} 
     108 
     109static GstStateChangeReturn 
     110gst_roar_mixer_element_change_state (GstElement * element, 
     111    GstStateChange transition) 
     112{ 
     113  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; 
     114  GstRoarMixerElement *this = GST_ROAR_MIXER_ELEMENT (element); 
     115 
     116  switch (transition) { 
     117    case GST_STATE_CHANGE_NULL_TO_READY: 
     118      if (!this->mixer) { 
     119        this->mixer = gst_roarmixer_new ("/dev/mixer", GST_ROAR_MIXER_ALL); 
     120      } 
     121      break; 
     122      break; 
     123    default: 
     124      break; 
     125  } 
     126 
     127  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); 
     128  if (ret == GST_STATE_CHANGE_FAILURE) 
     129    return ret; 
     130 
     131  switch (transition) { 
     132    case GST_STATE_CHANGE_READY_TO_NULL: 
     133      if (this->mixer) { 
     134        gst_roarmixer_free (this->mixer); 
     135        this->mixer = NULL; 
     136      } 
     137      break; 
     138    default: 
     139      break; 
     140  } 
     141 
     142  return ret; 
     143} 
     144 
     145 
     146gboolean gst_roarmixer_factory_init (GstPlugin * plugin) { 
     147  if (!gst_element_register(plugin, "roarmixer", GST_RANK_MARGINAL, 
     148                            GST_TYPE_ROARMIXER)) 
     149    return FALSE; 
     150 
     151  return TRUE; 
     152} 
     153 
    29154GstRoarMixer*    gst_roarmixer_new                (const gchar *device, 
    30155                                                 GstRoarMixerDirection dir) { 
  • plugins/gstreamer0.10/roarmixer.h

    r2072 r2073  
    3939G_BEGIN_DECLS 
    4040 
     41#define GST_ROAR_MIXER_ELEMENT(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ROAR_MIXER_ELEMENT,GstRoarMixerElement)) 
     42#define GST_ROAR_MIXER_ELEMENT_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ROAR_MIXER_ELEMENT,GstRoarMixerElementClass)) 
     43#define GST_IS_ROAR_MIXER_ELEMENT(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ROAR_MIXER_ELEMENT)) 
     44#define GST_IS_ROAR_MIXER_ELEMENT_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ROAR_MIXER_ELEMENT)) 
     45#define GST_TYPE_ROAR_MIXER_ELEMENT              (gst_roar_mixer_element_get_type()) 
     46 
     47 
     48typedef struct _GstRoarMixerElement GstRoarMixerElement; 
     49typedef struct _GstRoarMixerElementClass GstRoarMixerElementClass; 
     50typedef struct _GstRoarMixer GstRoarMixer; 
     51 
     52struct _GstRoarMixerElement { 
     53  GstElement            parent; 
     54 
     55  GstRoarMixer           *mixer; 
     56}; 
     57 
     58struct _GstRoarMixerElementClass { 
     59  GstElementClass       parent; 
     60}; 
     61 
     62 
     63GType           gst_roar_mixer_element_get_type          (void); 
     64 
    4165typedef enum { 
    4266  GST_ROAR_MIXER_CAPTURE = 1<<0, 
     
    4569} GstRoarMixerDirection; 
    4670 
    47 typedef struct _GstRoarMixer GstRoarMixer; 
    4871 
    4972#define GST_ROAR_MIXER(obj)              ((GstRoarMixer*)(obj)) 
     73 
     74#define GST_TYPE_ROARMIXER \ 
     75  (gst_roarmixer_get_type()) 
    5076 
    5177struct _GstRoarMixer { 
     
    74100} GstRoarMixerTrackClass; 
    75101 
     102GType gst_roarmixer_get_type(void); 
     103gboolean gst_roarmixer_factory_init (GstPlugin *plugin); 
    76104 
    77105GstRoarMixer*    gst_roarmixer_new                (const gchar *device, 
     
    93121                                                 gboolean mute); 
    94122 
     123#define GST_IMPLEMENT_ROAR_MIXER_METHODS(Type, interface_as_function)            \ 
     124static gboolean                                                                 \ 
     125interface_as_function ## _supported (Type *this, GType iface_type)              \ 
     126{                                                                               \ 
     127  g_assert (iface_type == GST_TYPE_MIXER);                                      \ 
     128                                                                                \ 
     129  return (this->mixer != NULL);                                                 \ 
     130}                                                                               \ 
     131                                                                                \ 
     132static const GList*                                                             \ 
     133interface_as_function ## _list_tracks (GstMixer * mixer)                        \ 
     134{                                                                               \ 
     135  Type *this = (Type*) mixer;                                                   \ 
     136                                                                                \ 
     137  g_return_val_if_fail (this != NULL, NULL);                                    \ 
     138  g_return_val_if_fail (this->mixer != NULL, NULL);                             \ 
     139                                                                                \ 
     140  return gst_roarmixer_list_tracks (this->mixer);                                \ 
     141}                                                                               \ 
     142                                                                                \ 
     143static void                                                                     \ 
     144interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track,  \ 
     145    gint * volumes)                                                             \ 
     146{                                                                               \ 
     147  Type *this = (Type*) mixer;                                                   \ 
     148                                                                                \ 
     149  g_return_if_fail (this != NULL);                                              \ 
     150  g_return_if_fail (this->mixer != NULL);                                       \ 
     151                                                                                \ 
     152  gst_roarmixer_set_volume (this->mixer, track, volumes);                        \ 
     153}                                                                               \ 
     154                                                                                \ 
     155static void                                                                     \ 
     156interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track,  \ 
     157    gint * volumes)                                                             \ 
     158{                                                                               \ 
     159  Type *this = (Type*) mixer;                                                   \ 
     160                                                                                \ 
     161  g_return_if_fail (this != NULL);                                              \ 
     162  g_return_if_fail (this->mixer != NULL);                                       \ 
     163                                                                                \ 
     164  gst_roarmixer_get_volume (this->mixer, track, volumes);                        \ 
     165}                                                                               \ 
     166                                                                                \ 
     167static void                                                                     \ 
     168interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track,  \ 
     169    gboolean record)                                                            \ 
     170{                                                                               \ 
     171  Type *this = (Type*) mixer;                                                   \ 
     172                                                                                \ 
     173  g_return_if_fail (this != NULL);                                              \ 
     174  g_return_if_fail (this->mixer != NULL);                                       \ 
     175                                                                                \ 
     176  gst_roarmixer_set_record (this->mixer, track, record);                         \ 
     177}                                                                               \ 
     178                                                                                \ 
     179static void                                                                     \ 
     180interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track,    \ 
     181    gboolean mute)                                                              \ 
     182{                                                                               \ 
     183  Type *this = (Type*) mixer;                                                   \ 
     184                                                                                \ 
     185  g_return_if_fail (this != NULL);                                              \ 
     186  g_return_if_fail (this->mixer != NULL);                                       \ 
     187                                                                                \ 
     188  gst_roarmixer_set_mute (this->mixer, track, mute);                             \ 
     189}                                                                               \ 
     190                                                                                \ 
     191static void                                                                     \ 
     192interface_as_function ## _interface_init (GstMixerClass * klass)                \ 
     193{                                                                               \ 
     194  GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE;                                  \ 
     195                                                                                \ 
     196  /* set up the interface hooks */                                              \ 
     197  klass->list_tracks = interface_as_function ## _list_tracks;                   \ 
     198  klass->set_volume = interface_as_function ## _set_volume;                     \ 
     199  klass->get_volume = interface_as_function ## _get_volume;                     \ 
     200  klass->set_mute = interface_as_function ## _set_mute;                         \ 
     201  klass->set_record = interface_as_function ## _set_record;                     \ 
     202} 
     203 
     204 
    95205G_END_DECLS 
    96206 
Note: See TracChangeset for help on using the changeset viewer.