Re: Fwd: Possible patch for #12706

2010-06-27 Thread James McKenzie

Jeff Cook wrote:

 This is a patch that makes WINE detect snd_usb_audio mics and assign
them a mixer and working master control. See bug #12706 for more
information about this problem: 
http://bugs.winehq.org/show_bug.cgi?id=12706


Please hold this patch until after Wine 1.2 is released.  Others may 
comment on the content to help you improve your code.


Also, if you are proposing new functionality, you have to include 
conformance tests that prove what you are trying to do is what native 
Windows does.


James McKenzie





Fwd: Possible patch for #12706

2010-06-25 Thread Jeff Cook

 This is a patch that makes WINE detect snd_usb_audio mics and assign
them a mixer and working master control. See bug #12706 for more
information about this problem: http://bugs.winehq.org/show_bug.cgi?id=12706

I wasn't able to test it completely because I wasn't able to switch my
default input device to the USB mic and no one in IRC is helping with
this, but it might make things work because theoretically the only
problem was that WINE was ignoring devices that looked like
snd_usb_audio's microphones. I suggest that someone who CAN get
snd_usb_audio mic as their default test it out and confirm, I would
really appreciate that.

Thanks to all in IRC who helped me get things this far, especially
mlankhorst.

This patch is based against the current git HEAD, eaa227c12d8bb. I've
also posted it at the aforementioned bug.

--
Jeff Cook
(801) 231-3157
j...@deserettechnology.com


diff --git a/dlls/winealsa.drv/mixer.c b/dlls/winealsa.drv/mixer.c
index cfdf95f..352bc83 100644
--- a/dlls/winealsa.drv/mixer.c
+++ b/dlls/winealsa.drv/mixer.c
@@ -245,6 +245,10 @@ static void fillcontrols(mixer *mmixer)
 for (id = 0; id  mmixer-chans; ++id)
 {
 line *mline = mmixer-lines[id];
+if (!mline-elem)
+{
+break;
+}
 int ofs = CONTROLSPERLINE * id;
 int x;
 long min, max;
@@ -258,6 +262,7 @@ static void fillcontrols(mixer *mmixer)
 else
 snd_mixer_selem_get_playback_volume_range(mline-elem, min, max);
 
+
 /* (!snd_mixer_selem_has_playback_volume(elem) || snd_mixer_selem_has_capture_volume(elem)) */
 /* Volume, always enabled by definition of blacklisted channels */
 mmixer-controls[ofs].enabled = 1;
@@ -332,17 +337,23 @@ static void filllines(mixer *mmixer, snd_mixer_elem_t *mastelem, snd_mixer_elem_
 snd_mixer_elem_t *elem;
 line *mline = mmixer-lines;
 
-/* Master control */
-MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(mastelem), -1, mline-name, sizeof(mline-name)/sizeof(WCHAR));
-mline-component = getcomponenttype(snd_mixer_selem_get_name(mastelem));
-mline-dst = 0;
-mline-capt = 0;
-mline-elem = mastelem;
-mline-chans = chans(mmixer, mastelem, 0);
-
-snd_mixer_elem_set_callback(mastelem, elem_callback);
-snd_mixer_elem_set_callback_private(mastelem, mmixer);
-
+if (mastelem) {
+FIXME(mastelem found on %s, building master...\n);
+/* Master control */
+MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(mastelem), -1, mline-name, sizeof(mline-name)/sizeof(WCHAR));
+mline-component = getcomponenttype(snd_mixer_selem_get_name(mastelem));
+mline-dst = 0;
+mline-capt = 0;
+mline-elem = mastelem;
+mline-chans = chans(mmixer, mastelem, 0);
+
+snd_mixer_elem_set_callback(mastelem, elem_callback);
+snd_mixer_elem_set_callback_private(mastelem, mmixer);
+} else {
+FIXME(no mastelem, skipping\n);
+MultiByteToWideChar(CP_UNIXCP, 0, Empty Master Element, -1, mline-name, sizeof(mline-name)/sizeof(WCHAR));
+}
+
 /* Capture control
  * Note: since mmixer-dests = 1, it means only playback control is visible
  * This makes sense, because if there are no capture sources capture control
@@ -352,8 +363,10 @@ static void filllines(mixer *mmixer, snd_mixer_elem_t *mastelem, snd_mixer_elem_
 ++mline;
 if (capt)
 {
+FIXME(captelem found\n);
 MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(captelem), -1, mline-name, sizeof(mline-name)/sizeof(WCHAR));
 mline-component = getcomponenttype(snd_mixer_selem_get_name(captelem));
+FIXME(elem name: %s\n, snd_mixer_selem_get_name(captelem));
 mline-dst = 1;
 mline-capt = 1;
 mline-elem = captelem;
@@ -361,6 +374,8 @@ static void filllines(mixer *mmixer, snd_mixer_elem_t *mastelem, snd_mixer_elem_
 
 snd_mixer_elem_set_callback(captelem, elem_callback);
 snd_mixer_elem_set_callback_private(captelem, mmixer);
+} else {
+FIXME(no capt\n);
 }
 
 for (elem = snd_mixer_first_elem(mmixer-mix); elem; elem = snd_mixer_elem_next(elem))
@@ -395,6 +410,24 @@ static void filllines(mixer *mmixer, snd_mixer_elem_t *mastelem, snd_mixer_elem_
 }
 }
 
+static void filllines_no_master(mixer *mmixer, snd_mixer_elem_t *captelem, int capt)
+{
+snd_mixer_elem_t *elem;
+line *mline = mmixer-lines;
+
+FIXME(captelem found\n);
+MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(captelem), -1, mline-name, sizeof(mline-name)/sizeof(WCHAR));
+mline-component = getcomponenttype(snd_mixer_selem_get_name(captelem));
+FIXME(elem name: %s\n, snd_mixer_selem_get_name(captelem));
+mline-dst = 0;
+mline-capt = 1;
+mline-elem = captelem;
+mline-chans = chans(mmixer, captelem, 1);
+
+snd_mixer_elem_set_callback(captelem,