|
|
2dc41f8 |
diff -Nur audacious-plugins-fedora-2.1-orig/src/alsa-ng/alsa-configure.c audacious-plugins-fedora-2.1/src/alsa-ng/alsa-configure.c
|
|
|
2dc41f8 |
--- audacious-plugins-fedora-2.1-orig/src/alsa-ng/alsa-configure.c 2009-07-07 00:40:36.000000000 +0200
|
|
|
2dc41f8 |
+++ audacious-plugins-fedora-2.1/src/alsa-ng/alsa-configure.c 2009-09-16 00:57:07.000000000 +0200
|
|
|
2dc41f8 |
@@ -245,8 +245,7 @@
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
void alsaplug_configure(void)
|
|
|
2dc41f8 |
{
|
|
|
2dc41f8 |
- GtkWidget *vbox, *notebook;
|
|
|
2dc41f8 |
- GtkWidget *dev_vbox, *adevice_frame, *adevice_box;
|
|
|
2dc41f8 |
+ GtkWidget * vbox, * adevice_frame, * adevice_box;
|
|
|
2dc41f8 |
GtkWidget *mixer_frame, *mixer_box, *mixer_table, *mixer_card_om;
|
|
|
2dc41f8 |
GtkWidget *mixer_card_label, *mixer_device_label;
|
|
|
2dc41f8 |
GtkWidget *bbox, *ok, *cancel;
|
|
|
2dc41f8 |
@@ -259,31 +258,25 @@
|
|
|
2dc41f8 |
return;
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- configure_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
|
2dc41f8 |
- gtk_signal_connect(GTK_OBJECT(configure_win), "destroy",
|
|
|
2dc41f8 |
- GTK_SIGNAL_FUNC(gtk_widget_destroyed),
|
|
|
2dc41f8 |
- &configure_win);
|
|
|
2dc41f8 |
- gtk_window_set_title(GTK_WINDOW(configure_win),
|
|
|
2dc41f8 |
- _("ALSA Driver configuration"));
|
|
|
2dc41f8 |
- gtk_window_set_policy(GTK_WINDOW(configure_win),
|
|
|
2dc41f8 |
- FALSE, TRUE, FALSE);
|
|
|
2dc41f8 |
- gtk_container_border_width(GTK_CONTAINER(configure_win), 10);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- vbox = gtk_vbox_new(FALSE, 10);
|
|
|
2dc41f8 |
- gtk_container_add(GTK_CONTAINER(configure_win), vbox);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- notebook = gtk_notebook_new();
|
|
|
2dc41f8 |
- gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- dev_vbox = gtk_vbox_new(FALSE, 5);
|
|
|
2dc41f8 |
- gtk_container_set_border_width(GTK_CONTAINER(dev_vbox), 5);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- adevice_frame = gtk_frame_new(_("Audio device:"));
|
|
|
2dc41f8 |
- gtk_box_pack_start(GTK_BOX(dev_vbox), adevice_frame, FALSE, FALSE, 0);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- adevice_box = gtk_vbox_new(FALSE, 5);
|
|
|
2dc41f8 |
- gtk_container_set_border_width(GTK_CONTAINER(adevice_box), 5);
|
|
|
2dc41f8 |
- gtk_container_add(GTK_CONTAINER(adevice_frame), adevice_box);
|
|
|
2dc41f8 |
+ configure_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
|
2dc41f8 |
+ gtk_window_set_title ((GtkWindow *) configure_win, _("ALSA Output "
|
|
|
2dc41f8 |
+ "Plugin Preferences"));
|
|
|
2dc41f8 |
+ gtk_window_set_type_hint ((GtkWindow *) configure_win,
|
|
|
2dc41f8 |
+ GDK_WINDOW_TYPE_HINT_DIALOG);
|
|
|
2dc41f8 |
+ gtk_window_set_resizable ((GtkWindow *) configure_win, FALSE);
|
|
|
2dc41f8 |
+ gtk_container_set_border_width ((GtkContainer *) configure_win, 6);
|
|
|
2dc41f8 |
+ g_signal_connect ((GObject *) configure_win, "destroy", (GCallback)
|
|
|
2dc41f8 |
+ gtk_widget_destroyed, & configure_win);
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ vbox = gtk_vbox_new (FALSE, 6);
|
|
|
2dc41f8 |
+ gtk_container_add ((GtkContainer *) configure_win, vbox);
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ adevice_frame = gtk_frame_new (_("Device:"));
|
|
|
2dc41f8 |
+ gtk_box_pack_start ((GtkBox *) vbox, adevice_frame, FALSE, FALSE, 0);
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ adevice_box = gtk_vbox_new (FALSE, 6);
|
|
|
2dc41f8 |
+ gtk_container_set_border_width ((GtkContainer *) adevice_box, 6);
|
|
|
2dc41f8 |
+ gtk_container_add ((GtkContainer *) adevice_frame, adevice_box);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
devices_combo = gtk_combo_new();
|
|
|
2dc41f8 |
gtk_box_pack_start(GTK_BOX(adevice_box), devices_combo,
|
|
|
2dc41f8 |
@@ -292,12 +285,12 @@
|
|
|
2dc41f8 |
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(devices_combo)->entry),
|
|
|
2dc41f8 |
alsaplug_cfg.pcm_device);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- mixer_frame = gtk_frame_new(_("Mixer:"));
|
|
|
2dc41f8 |
- gtk_box_pack_start(GTK_BOX(dev_vbox), mixer_frame, FALSE, FALSE, 0);
|
|
|
2dc41f8 |
+ mixer_frame = gtk_frame_new (_("Mixer:"));
|
|
|
2dc41f8 |
+ gtk_box_pack_start ((GtkBox *) vbox, mixer_frame, FALSE, FALSE, 0);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- mixer_box = gtk_vbox_new(FALSE, 5);
|
|
|
2dc41f8 |
- gtk_container_set_border_width(GTK_CONTAINER(mixer_box), 5);
|
|
|
2dc41f8 |
- gtk_container_add(GTK_CONTAINER(mixer_frame), mixer_box);
|
|
|
2dc41f8 |
+ mixer_box = gtk_vbox_new (FALSE, 6);
|
|
|
2dc41f8 |
+ gtk_container_set_border_width ((GtkContainer *) mixer_box, 6);
|
|
|
2dc41f8 |
+ gtk_container_add ((GtkContainer *) mixer_frame, mixer_box);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
mixer_table = gtk_table_new(2, 2, FALSE);
|
|
|
2dc41f8 |
gtk_table_set_row_spacings(GTK_TABLE(mixer_table), 5);
|
|
|
2dc41f8 |
@@ -331,9 +324,6 @@
|
|
|
2dc41f8 |
gtk_table_attach(GTK_TABLE(mixer_table), mixer_devices_combo,
|
|
|
2dc41f8 |
1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dev_vbox,
|
|
|
2dc41f8 |
- gtk_label_new(_("Device settings")));
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
bbox = gtk_hbutton_box_new();
|
|
|
2dc41f8 |
gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
|
|
|
2dc41f8 |
gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
|
|
|
2dc41f8 |
diff -Nur audacious-plugins-fedora-2.1-orig/src/alsa-ng/alsa-core.c audacious-plugins-fedora-2.1/src/alsa-ng/alsa-core.c
|
|
|
2dc41f8 |
--- audacious-plugins-fedora-2.1-orig/src/alsa-ng/alsa-core.c 2009-07-07 00:40:36.000000000 +0200
|
|
|
2dc41f8 |
+++ audacious-plugins-fedora-2.1/src/alsa-ng/alsa-core.c 2009-09-16 00:57:07.000000000 +0200
|
|
|
2dc41f8 |
@@ -222,10 +222,14 @@
|
|
|
2dc41f8 |
else
|
|
|
2dc41f8 |
{
|
|
|
2dc41f8 |
gint err = snd_pcm_recover(pcm_handle, wr_frames, 1);
|
|
|
2dc41f8 |
- if (err < 0)
|
|
|
2dc41f8 |
- _ERROR("(write) snd_pcm_recover: %s", snd_strerror(err));
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- return;
|
|
|
2dc41f8 |
+ _DEBUG ("snd_pcm_writei error: %s", snd_strerror (wr_frames));
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ if (err < 0)
|
|
|
2dc41f8 |
+ {
|
|
|
2dc41f8 |
+ _ERROR ("snd_pcm_recover error: %s", snd_strerror (err));
|
|
|
2dc41f8 |
+ return;
|
|
|
2dc41f8 |
+ }
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
@@ -299,13 +303,40 @@
|
|
|
2dc41f8 |
if (alsaplug_cfg.mixer_card == NULL)
|
|
|
2dc41f8 |
alsaplug_cfg.mixer_card = g_strdup("default");
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
+ if (!alsaplug_mixer_new(&amixer))
|
|
|
2dc41f8 |
+ mixer_ready = TRUE;
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
return OUTPUT_PLUGIN_INIT_FOUND_DEVICES;
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
+static void alsaplug_cleanup(void)
|
|
|
2dc41f8 |
+{
|
|
|
2dc41f8 |
+ if (mixer_ready == TRUE)
|
|
|
2dc41f8 |
+ {
|
|
|
2dc41f8 |
+ snd_mixer_detach(amixer, alsaplug_cfg.mixer_card);
|
|
|
2dc41f8 |
+ snd_mixer_close(amixer);
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ amixer = NULL;
|
|
|
2dc41f8 |
+ mixer_ready = FALSE;
|
|
|
2dc41f8 |
+ }
|
|
|
2dc41f8 |
+}
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+#define CHECK_FAIL(expression, name) \
|
|
|
2dc41f8 |
+{ \
|
|
|
2dc41f8 |
+ gint error = expression; \
|
|
|
2dc41f8 |
+ if (error) \
|
|
|
2dc41f8 |
+ { \
|
|
|
2dc41f8 |
+ _ERROR (name " failed: %s.\n", snd_strerror (error)); \
|
|
|
2dc41f8 |
+ snd_pcm_close (pcm_handle); \
|
|
|
2dc41f8 |
+ pcm_handle = NULL; \
|
|
|
2dc41f8 |
+ return -1; \
|
|
|
2dc41f8 |
+ } \
|
|
|
2dc41f8 |
+}
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
static gint
|
|
|
2dc41f8 |
alsaplug_open_audio(AFormat fmt, gint rate, gint nch)
|
|
|
2dc41f8 |
{
|
|
|
2dc41f8 |
- gint err, bitwidth, ringbuf_size;
|
|
|
2dc41f8 |
+ gint err, bitwidth, ringbuf_size, buf_size;
|
|
|
2dc41f8 |
snd_pcm_format_t afmt;
|
|
|
2dc41f8 |
snd_pcm_hw_params_t *hwparams = NULL;
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
@@ -316,9 +347,6 @@
|
|
|
2dc41f8 |
return -1;
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- if (!alsaplug_mixer_new(&amixer))
|
|
|
2dc41f8 |
- mixer_ready = TRUE;
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
if ((err = snd_pcm_open(&pcm_handle, alsaplug_cfg.pcm_device, SND_PCM_STREAM_PLAYBACK, 0)) < 0)
|
|
|
2dc41f8 |
{
|
|
|
2dc41f8 |
_ERROR("snd_pcm_open: %s", snd_strerror(err));
|
|
|
2dc41f8 |
@@ -328,27 +356,31 @@
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
snd_pcm_hw_params_alloca(&hwparams);
|
|
|
2dc41f8 |
snd_pcm_hw_params_any(pcm_handle, hwparams);
|
|
|
2dc41f8 |
- snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
|
|
|
2dc41f8 |
- snd_pcm_hw_params_set_format(pcm_handle, hwparams, afmt);
|
|
|
2dc41f8 |
- snd_pcm_hw_params_set_channels(pcm_handle, hwparams, nch);
|
|
|
2dc41f8 |
- snd_pcm_hw_params_set_rate(pcm_handle, hwparams, rate, 0);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
- err = snd_pcm_hw_params(pcm_handle, hwparams);
|
|
|
2dc41f8 |
- if (err < 0)
|
|
|
2dc41f8 |
- {
|
|
|
2dc41f8 |
- _ERROR("snd_pcm_hw_params failed: %s", snd_strerror(err));
|
|
|
2dc41f8 |
- return -1;
|
|
|
2dc41f8 |
- }
|
|
|
2dc41f8 |
+ CHECK_FAIL (snd_pcm_hw_params_set_access (pcm_handle, hwparams,
|
|
|
2dc41f8 |
+ SND_PCM_ACCESS_RW_INTERLEAVED), "snd_pcm_hw_params_set_access");
|
|
|
2dc41f8 |
+ CHECK_FAIL (snd_pcm_hw_params_set_format (pcm_handle, hwparams, afmt),
|
|
|
2dc41f8 |
+ "snd_pcm_hw_params_set_format");
|
|
|
2dc41f8 |
+ CHECK_FAIL (snd_pcm_hw_params_set_channels (pcm_handle, hwparams, nch),
|
|
|
2dc41f8 |
+ "snd_pcm_hw_params_set_channels");
|
|
|
2dc41f8 |
+ CHECK_FAIL (snd_pcm_hw_params_set_rate (pcm_handle, hwparams, rate, 0),
|
|
|
2dc41f8 |
+ "snd_pcm_hw_params_set_rate");
|
|
|
2dc41f8 |
+ CHECK_FAIL (snd_pcm_hw_params (pcm_handle, hwparams), "snd_pcm_hw_params");
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
bitwidth = snd_pcm_format_physical_width(afmt);
|
|
|
2dc41f8 |
bps = (rate * bitwidth * nch) >> 3;
|
|
|
2dc41f8 |
- ringbuf_size = aud_cfg->output_buffer_size * bps / 1000;
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
+ buf_size = MAX(aud_cfg->output_buffer_size, 100);
|
|
|
2dc41f8 |
+ ringbuf_size = buf_size * bps / 1000;
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
if (alsaplug_ringbuffer_init(&pcm_ringbuf, ringbuf_size) == -1) {
|
|
|
2dc41f8 |
_ERROR("alsaplug_ringbuffer_init failed");
|
|
|
2dc41f8 |
return -1;
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
+
|
|
|
2dc41f8 |
pcm_going = TRUE;
|
|
|
2dc41f8 |
flush_request = -1;
|
|
|
2dc41f8 |
+ paused = FALSE;
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
audio_thread = g_thread_create(alsaplug_loop, NULL, TRUE, NULL);
|
|
|
2dc41f8 |
return 1;
|
|
|
2dc41f8 |
@@ -371,15 +403,6 @@
|
|
|
2dc41f8 |
g_thread_join(audio_thread);
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
audio_thread = NULL;
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- if (mixer_ready == TRUE)
|
|
|
2dc41f8 |
- {
|
|
|
2dc41f8 |
- snd_mixer_detach(amixer, alsaplug_cfg.mixer_card);
|
|
|
2dc41f8 |
- snd_mixer_close(amixer);
|
|
|
2dc41f8 |
-
|
|
|
2dc41f8 |
- amixer = NULL;
|
|
|
2dc41f8 |
- mixer_ready = FALSE;
|
|
|
2dc41f8 |
- }
|
|
|
2dc41f8 |
}
|
|
|
2dc41f8 |
|
|
|
2dc41f8 |
static void
|
|
|
2dc41f8 |
@@ -500,6 +523,7 @@
|
|
|
2dc41f8 |
.description = "ALSA Output Plugin (-ng)",
|
|
|
2dc41f8 |
.probe_priority = 1,
|
|
|
2dc41f8 |
.init = alsaplug_init,
|
|
|
2dc41f8 |
+ .cleanup = alsaplug_cleanup,
|
|
|
2dc41f8 |
.open_audio = alsaplug_open_audio,
|
|
|
2dc41f8 |
.close_audio = alsaplug_close_audio,
|
|
|
2dc41f8 |
.write_audio = alsaplug_write_audio,
|