Hi all:
I slove the problem that qemu doesn't support to disable the sound completely 
when someone choose ich6 sound card.
I test it in centos 6.3,guest win7,ich6 sound card.it works fine. 

my patch:
--- qemu-kvm-0.12.1.2/hw/hda-audio.c    2013-01-29 
10:07:34.750968170 +0800
+++ qemu-kvm-0.12.1.2.new/hw/hda-audio.c    2013-01-29 
10:07:05.696283899 +0800
@@ -647,10 +647,59 @@
         hda_codec_response(hda, true, 
node->pinctl);
         break;
     case AC_VERB_SET_PIN_WIDGET_CONTROL:
-        if (node->pinctl != payload) {
+        if (node->pinctl != payload)
+        {
+            if 
(node->pinctl == 0x40 && payload == 0)
+            {
+               
 st = a->st + node->stindex;
+               
 if (st->node == NULL)
+               
 {
+                   
 goto fail;
+               
 }
+               
 dprint(a, 1, "amp (%s): %s%s%s%s index %d  gain %3d %s\n",
+                  
 st->node->name,
+                  
 (payload & AC_AMP_SET_OUTPUT) ? "o" : "-",
+                  
 (payload & AC_AMP_SET_INPUT)  ? "i" : "-",
+                  
 (payload & AC_AMP_SET_LEFT)   ? "l" : "-",
+                  
 (payload & AC_AMP_SET_RIGHT)  ? "r" : "-",
+                  
 (payload & AC_AMP_SET_INDEX) >> AC_AMP_SET_INDEX_SHIFT,
+                  
 (payload & AC_AMP_GAIN),
+                  
 (payload & AC_AMP_MUTE) ? "muted" : "");
+               
 st->gain_left = payload & AC_AMP_GAIN;
+               
 st->mute_left = payload & AC_AMP_MUTE;
+               
 st->gain_right = payload & AC_AMP_GAIN;
+               
 st->mute_right = payload & AC_AMP_MUTE;
+               
 
hda_audio_setup(st);           
 
+               
 hda_audio_set_amp(st);
+               
 hda_audio_set_running(st, false);
+            }  
             
dprint(a, 1, "unhandled pin control bit\n");
         }
-        hda_codec_response(hda, true, 0);
+        else
+        {
+            st = a->st 
+ node->stindex;
+            if 
(st->node == NULL)
+            {
+               
 goto fail;
+            }
+            dprint(a, 
1, "amp (%s): %s%s%s%s index %d  gain %3d %s\n",
+                  
 st->node->name,
+                  
 (payload & AC_AMP_SET_OUTPUT) ? "o" : "-",
+                  
 (payload & AC_AMP_SET_INPUT)  ? "i" : "-",
+                  
 (payload & AC_AMP_SET_LEFT)   ? "l" : "-",
+                  
 (payload & AC_AMP_SET_RIGHT)  ? "r" : "-",
+                  
 (payload & AC_AMP_SET_INDEX) >> AC_AMP_SET_INDEX_SHIFT,
+                  
 (payload & AC_AMP_GAIN),
+                  
 (payload & AC_AMP_MUTE) ? "muted" : "");
+            
st->gain_left = payload & AC_AMP_GAIN;
+            
st->mute_left = payload & AC_AMP_MUTE;
+            
st->gain_right = payload & AC_AMP_GAIN;
+            
st->mute_right = payload & AC_AMP_MUTE;
+            
hda_audio_setup(st);           
 
+            
hda_audio_set_amp(st);
+            
hda_audio_set_running(st, true);
+        }
+        hda_codec_response(hda, true, 0);
         break;
 
     /* audio in/out widget */ 
     

Reply via email to