Very basic (and ugly) OSS support

This commit is contained in:
Pierre Pronchery 2010-11-12 23:35:46 +00:00
parent ab803e50ab
commit 071bb2fd47

View File

@ -137,7 +137,9 @@ static GtkWidget * _new_enum(Mixer * mixer, int dev,
struct audio_mixer_enum * e); struct audio_mixer_enum * e);
static GtkWidget * _new_set(Mixer * mixer, int dev, struct audio_mixer_set * s); static GtkWidget * _new_set(Mixer * mixer, int dev, struct audio_mixer_set * s);
static GtkWidget * _new_value(Mixer * mixer, int dev, static GtkWidget * _new_value(Mixer * mixer, int dev,
struct audio_mixer_value * v); struct audio_mixer_value * value);
#else
static GtkWidget * _new_value(Mixer * mixer, int dev, int value);
#endif #endif
Mixer * mixer_new(char const * device, MixerOrientation orientation) Mixer * mixer_new(char const * device, MixerOrientation orientation)
@ -154,8 +156,11 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
#ifdef AUDIO_MIXER_DEVINFO #ifdef AUDIO_MIXER_DEVINFO
mixer_devinfo_t md; mixer_devinfo_t md;
MixerClass * p; MixerClass * p;
#endif
size_t u; size_t u;
#else
int value;
char const * names[] = SOUND_DEVICE_LABELS;
#endif
if((mixer = malloc(sizeof(*mixer))) == NULL) if((mixer = malloc(sizeof(*mixer))) == NULL)
return NULL; return NULL;
@ -222,7 +227,8 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
memcpy(&p->label, &md.label, sizeof(md.label)); memcpy(&p->label, &md.label, sizeof(md.label));
p->hbox = NULL; p->hbox = NULL;
#else #else
/* FIXME implement */ hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(hvbox), hbox, FALSE, TRUE, 0);
break; break;
#endif #endif
} }
@ -269,8 +275,17 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
} }
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 2); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 2);
#else #else
/* FIXME implement */ if(i == SOUND_MIXER_NONE)
break; break;
if(ioctl(mixer->fd, MIXER_READ(i), &value) < 0)
{
_mixer_error(NULL, "MIXER_READ", 0);
continue;
}
control = _new_value(mixer, i, value);
widget = gtk_frame_new(names[i]);
gtk_container_add(GTK_CONTAINER(widget), control);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 2);
#endif #endif
} }
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
@ -349,38 +364,58 @@ static GtkWidget * _new_set(Mixer * mixer, int dev, struct audio_mixer_set * s)
} }
return vbox; return vbox;
} }
#endif
#ifdef AUDIO_MIXER_DEVINFO
static GtkWidget * _new_value(Mixer * mixer, int dev, static GtkWidget * _new_value(Mixer * mixer, int dev,
struct audio_mixer_value * v) struct audio_mixer_value * value)
#else
static GtkWidget * _new_value(Mixer * mixer, int dev, int value)
#endif
{ {
mixer_ctrl_t * p;
GtkWidget * vbox; GtkWidget * vbox;
GtkWidget * hbox; GtkWidget * hbox;
int i; int i;
GtkWidget * widget; GtkWidget * widget;
GtkWidget * bind; GtkWidget * bind;
GSList * list = NULL; GSList * list = NULL;
gdouble v;
#ifdef AUDIO_MIXER_DEVINFO
mixer_ctrl_t * p;
int num_channels = value->num_channels;
#else
unsigned int * channel;
const int num_channels = 2;
#endif
if(v->num_channels <= 0) if(num_channels <= 0)
return NULL; return NULL;
#ifdef AUDIO_MIXER_DEVINFO
if((p = _mixer_get(mixer, dev)) == NULL) if((p = _mixer_get(mixer, dev)) == NULL)
return NULL; return NULL;
#endif
hbox = gtk_hbox_new(TRUE, 0); hbox = gtk_hbox_new(TRUE, 0);
bind = gtk_toggle_button_new_with_label(_("Bind")); bind = gtk_toggle_button_new_with_label(_("Bind"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bind), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bind), TRUE);
for(i = 0; i < v->num_channels; i++) for(i = 0; i < num_channels; i++)
{ {
widget = gtk_vscale_new_with_range(0.0, 100.0, 1.0); widget = gtk_vscale_new_with_range(0.0, 100.0, 1.0);
gtk_range_set_inverted(GTK_RANGE(widget), TRUE); gtk_range_set_inverted(GTK_RANGE(widget), TRUE);
gtk_range_set_value(GTK_RANGE(widget), #ifdef AUDIO_MIXER_DEVINFO
(p->un.value.level[i] / 255.0) * 100.0); v = (p->un.value.level[i] / 255.0) * 100.0;
#else
v = (((value >> (i * 8)) & 0xff) / 127.0) * 100.0;
#endif
gtk_range_set_value(GTK_RANGE(widget), v);
g_object_set_data(G_OBJECT(widget), "bind", bind); g_object_set_data(G_OBJECT(widget), "bind", bind);
#ifdef AUDIO_MIXER_DEVINFO
g_object_set_data(G_OBJECT(widget), "ctrl", p); g_object_set_data(G_OBJECT(widget), "ctrl", p);
g_object_set_data(G_OBJECT(widget), "channel", g_object_set_data(G_OBJECT(widget), "channel",
&p->un.value.level[i]); &p->un.value.level[i]);
#ifdef DEBUG #else
fprintf(stderr, "DEBUG: %s(%p) g_signal_connect() \"%s\"\n", if((channel = malloc(sizeof(*channel))) != NULL)
__func__, (void*)mixer, "value-changed"); *channel = dev;
g_object_set_data(G_OBJECT(widget), "channel", channel);
#endif #endif
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK( g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(
on_value_changed), mixer); on_value_changed), mixer);
@ -388,7 +423,7 @@ static GtkWidget * _new_value(Mixer * mixer, int dev,
list = g_slist_append(list, widget); list = g_slist_append(list, widget);
} }
g_object_set_data(G_OBJECT(bind), "list", list); g_object_set_data(G_OBJECT(bind), "list", list);
if(v->num_channels < 2) if(num_channels < 2)
return hbox; return hbox;
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
@ -396,7 +431,6 @@ static GtkWidget * _new_value(Mixer * mixer, int dev,
gtk_box_pack_start(GTK_BOX(vbox), bind, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), bind, FALSE, TRUE, 0);
return vbox; return vbox;
} }
#endif
/* mixer_delete */ /* mixer_delete */
@ -446,20 +480,23 @@ int mixer_set_enum(Mixer * mixer, GtkWidget * widget)
/* mixer_set_value */ /* mixer_set_value */
int mixer_set_value(Mixer * mixer, GtkWidget * widget, gdouble value) int mixer_set_value(Mixer * mixer, GtkWidget * widget, gdouble value)
{ {
#ifdef AUDIO_MIXER_DEVINFO
GtkWidget * b; GtkWidget * b;
mixer_ctrl_t * p;
u_char * level;
int i; int i;
GSList * q; GSList * q;
#ifdef AUDIO_MIXER_DEVINFO
mixer_ctrl_t * p;
u_char * level;
#else
unsigned int * channel;
int level;
#endif #endif
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%p, %lf) fd=%d\n", __func__, (void*)mixer, fprintf(stderr, "DEBUG: %s(%p, %lf) fd=%d\n", __func__, (void*)mixer,
value, mixer->fd); value, mixer->fd);
#endif #endif
#ifdef AUDIO_MIXER_DEVINFO
b = g_object_get_data(G_OBJECT(widget), "bind"); b = g_object_get_data(G_OBJECT(widget), "bind");
#ifdef AUDIO_MIXER_DEVINFO
p = g_object_get_data(G_OBJECT(widget), "ctrl"); p = g_object_get_data(G_OBJECT(widget), "ctrl");
level = g_object_get_data(G_OBJECT(widget), "channel"); level = g_object_get_data(G_OBJECT(widget), "channel");
if(p == NULL || level == NULL) if(p == NULL || level == NULL)
@ -483,7 +520,21 @@ int mixer_set_value(Mixer * mixer, GtkWidget * widget, gdouble value)
return 0; return 0;
return _mixer_error(mixer, "AUDIO_MIXER_WRITE", 1); return _mixer_error(mixer, "AUDIO_MIXER_WRITE", 1);
#else #else
/* FIXME implement */ channel = g_object_get_data(G_OBJECT(widget), "channel");
if(b != NULL && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b)))
{
for(i = 0, q = g_object_get_data(G_OBJECT(b), "list");
q != NULL; i++, q = q->next)
{
level |= (int)((value / 100.0) * 127) << (i * 8);
gtk_range_set_value(GTK_RANGE(q->data), value);
}
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s() level=0x%x\n", __func__, level);
#endif
if(ioctl(mixer->fd, MIXER_WRITE(*channel), &level) != 0)
return _mixer_error(mixer, "MIXER_WRITE", 1);
}
return 0; return 0;
#endif #endif
} }