static struct mixer * audio_output_load_mixer(void *ao, const struct config_param *param, const struct mixer_plugin *plugin, struct filter *filter_chain, GError **error_r) { struct mixer *mixer; switch (audio_output_mixer_type(param)) { case MIXER_TYPE_NONE: case MIXER_TYPE_UNKNOWN: return NULL; case MIXER_TYPE_HARDWARE: if (plugin == NULL) return NULL; return mixer_new(plugin, ao, param, error_r); case MIXER_TYPE_SOFTWARE: mixer = mixer_new(&software_mixer_plugin, NULL, NULL, NULL); assert(mixer != NULL); filter_chain_append(filter_chain, software_mixer_get_filter(mixer)); return mixer; } assert(false); return NULL; }
int main(int argc, G_GNUC_UNUSED char **argv) { GError *error = NULL; struct mixer *mixer; bool success; int volume; if (argc != 2) { g_printerr("Usage: read_mixer PLUGIN\n"); return 1; } g_thread_init(NULL); mixer = mixer_new(&alsa_mixer_plugin, NULL, NULL, &error); if (mixer == NULL) { g_printerr("mixer_new() failed: %s\n", error->message); g_error_free(error); return 2; } success = mixer_open(mixer, &error); if (!success) { mixer_free(mixer); g_printerr("failed to open the mixer: %s\n", error->message); g_error_free(error); return 2; } volume = mixer_get_volume(mixer, &error); mixer_close(mixer); mixer_free(mixer); assert(volume >= -1 && volume <= 100); if (volume < 0) { if (error != NULL) { g_printerr("failed to read volume: %s\n", error->message); g_error_free(error); } else g_printerr("failed to read volume\n"); return 2; } g_print("%d\n", volume); return 0; }
/* mixerwindow_new */ MixerWindow * mixerwindow_new(char const * device, MixerLayout layout, gboolean embedded) { MixerWindow * mixer; GtkAccelGroup * accel; GtkWidget * vbox; GtkWidget * widget; MixerProperties properties; char buf[80]; unsigned long id; if((mixer = object_new(sizeof(*mixer))) == NULL) return NULL; accel = gtk_accel_group_new(); mixer->window = NULL; mixer->about = NULL; if(embedded) { mixer->window = gtk_plug_new(0); g_signal_connect_swapped(mixer->window, "embedded", G_CALLBACK( on_embedded), mixer); } else { mixer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_add_accel_group(GTK_WINDOW(mixer->window), accel); gtk_window_set_default_size(GTK_WINDOW(mixer->window), 800, 350); #if GTK_CHECK_VERSION(2, 6, 0) gtk_window_set_icon_name(GTK_WINDOW(mixer->window), "stock_volume"); #endif gtk_window_set_title(GTK_WINDOW(mixer->window), _("Mixer")); g_signal_connect_swapped(mixer->window, "delete-event", G_CALLBACK(on_closex), mixer); } mixer->mixer = NULL; mixer->fullscreen = FALSE; if(mixer->window != NULL) { gtk_widget_realize(mixer->window); mixer->mixer = mixer_new(mixer->window, device, layout); } if(mixer->mixer == NULL) { mixerwindow_delete(mixer); return NULL; } #if GTK_CHECK_VERSION(3, 0, 0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else vbox = gtk_vbox_new(FALSE, 0); #endif #ifndef EMBEDDED /* menubar */ if(embedded == FALSE) { if(layout == ML_TABBED) _mixer_menubar[1].menu = _mixer_menu_view_tabbed; mixer->menubar = desktop_menubar_create(_mixer_menubar, mixer, accel); gtk_box_pack_start(GTK_BOX(vbox), mixer->menubar, FALSE, TRUE, 0); } else mixer->menubar = NULL; #else desktop_accel_create(_mixer_accel, mixer, accel); #endif /* toolbar */ if(embedded == FALSE) { if(layout != ML_TABBED) _mixer_toolbar[3].name = ""; widget = desktop_toolbar_create(_mixer_toolbar, mixer, accel); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); } #ifndef EMBEDDED g_object_unref(accel); #endif widget = mixer_get_widget(mixer->mixer); gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(mixer->window), vbox); gtk_widget_show_all(vbox); if(embedded) { /* print the window ID and force a flush */ id = gtk_plug_get_id(GTK_PLUG(mixer->window)); printf("%lu\n", id); fclose(stdout); } else { /* set the window title */ if(mixer_get_properties(mixer->mixer, &properties) == 0) { snprintf(buf, sizeof(buf), "%s - %s%s%s", _("Mixer"), properties.name, strlen(properties.version) ? " " : "", properties.version); gtk_window_set_title(GTK_WINDOW(mixer->window), buf); } gtk_widget_show(mixer->window); } return mixer; }