Изменение громкости системного микшера. FASM

Тема в разделе "WASM.WIN32", создана пользователем Land12, 28 янв 2007.

  1. Land12

    Land12 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    3
    Всем привет!
    Обращаюсь к вам, так как уже не знаю в чем проблема.. Я пишу отключение/изменение громкости микшера. Сначала все писалось на Visual C++ - все работало отлично, переписываю на FASM - появляются косяки, т.е. не работает. Я определил, что ф-ция mixerGetControlDetails возвращает ошибку. Вроде уже все просмотрел, сверял, глядел в отладчике передаваемые структуры.. Посмотрите, пожалуйста, может кто найдет, в чем ошибка, уже 2 дня долбаюсь..

    Код на C++:
    Код (Text):
    1. #undef UNICODE
    2. #include <windows.h>
    3. #include <mmsystem.h>
    4.  
    5. HMIXER hMixer;
    6. MIXERLINE ml;
    7. MIXERLINECONTROLS mlc;
    8. MIXERCONTROL mc;
    9. MIXERCONTROLDETAILS mcd;
    10. DWORD Volume;
    11. MMRESULT Ret;
    12.  
    13. void main (void)
    14. {
    15.     Ret = mixerOpen(&hMixer, 0, NULL, NULL, 0);
    16.     if (Ret != MMSYSERR_NOERROR) return;
    17.  
    18.     ml.cbStruct = sizeof(ml);
    19.     ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    20.  
    21.     Ret = mixerGetLineInfo((HMIXEROBJ)hMixer, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);
    22.     if (Ret != MMSYSERR_NOERROR) return;
    23.  
    24.     mlc.cbStruct = sizeof(mlc);
    25.     mlc.dwLineID = ml.dwLineID;
    26.    
    27.     mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
    28.    
    29.     mlc.cControls = 1;
    30.     mlc.cbmxctrl = sizeof(mc);
    31.     mlc.pamxctrl = &mc;
    32.     mc.cbStruct = sizeof(mc);
    33.  
    34.     Ret = mixerGetLineControls((HMIXEROBJ)hMixer, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
    35.     if (Ret != MMSYSERR_NOERROR) return;
    36.  
    37.     mcd.cbStruct = sizeof(mcd);
    38.     mcd.cbDetails = sizeof(Volume);
    39.     mcd.paDetails = &Volume;
    40.     mcd.dwControlID = mc.dwControlID;
    41.     mcd.cChannels = 1;
    42.     mixerGetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_GETCONTROLDETAILSF_VALUE);
    43.  
    44.     Volume = !Volume;
    45.    
    46.     mixerSetControlDetails((HMIXEROBJ)hMixer, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
    47.     PlaySound(TEXT("c:\\windows\\media\\start.wav"), NULL, SND_FILENAME | SND_ASYNC);
    48.  
    49.     mixerClose(hMixer);
    50. }
    Код на FASM:
    Код (Text):
    1. format pe gui 4.0
    2. entry start
    3.  
    4. include 'include\win32a.inc'
    5.  
    6. ;--------------------
    7.  
    8. struct MIXERCONTROL
    9.     cbStruct dd ?
    10.     dwControlId dd ?
    11.     dwControlType dd ?
    12.     fdwControl dd ?
    13.     cMultipleItems dd ?
    14.     szShortName db 16 dup (?)
    15.     szName db 64 dup (?)
    16.     Bounds dd 6 dup (?)
    17.     Metrics dd 6 dup (?)
    18. ends
    19.  
    20. struct MIXERCONTROLDETAILS
    21.     cbStruct dd ?
    22.     dwControlId dd ?
    23.     cChannels dd ?
    24.     cMultipleItems dd ?
    25.     cbDetails dd ?
    26.     paDetails dd ?
    27. ends
    28.  
    29. struct MIXERLINE
    30.     cbStruct dd ?
    31.     dwDestination dd ?
    32.     dwSource dd ?
    33.     dwLineId dd ?
    34.     fdwLine dd ?
    35.     dwUser dd ?
    36.     dwComponentType dd ?
    37.     cChannels dd ?
    38.     cConnections dd ?
    39.     cControls dd ?
    40.     szShortName db 16 dup (?)
    41.     szName db 64 dup (?)
    42.     dwType dd ?
    43.     dwDeviceId dd ?
    44.     wMid dw ?
    45.     wPid dw ?
    46.     vDriverVersion dd ?
    47.     szPname db 32 dup (?)
    48. ends
    49.  
    50. struct MIXERLINECONTROLS
    51.     cbStruct dd ?
    52.     dwLineId dd ?
    53.     dwControlType dd ?
    54.     cControls dd ?
    55.     cbmxctrl dd ?
    56.     pamxctrl dd ?  
    57. ends
    58.  
    59. ;--------------------
    60.  
    61. section '.data' data readable writeable
    62.  
    63.     dwD dd 0
    64.     ml MIXERLINE
    65.     mlc MIXERLINECONTROLS
    66.     mc MIXERCONTROL
    67.     mcd MIXERCONTROLDETAILS
    68.     hObject dd ?
    69.     hEvent dd ?
    70.     hThread dd ?
    71.     hMixer dd ?
    72.  
    73. ;--------------------
    74.  
    75. section '.code' code readable executable
    76. start:
    77.  
    78.     xor ebx, ebx
    79.  
    80.     call ChangeVolume
    81.  
    82.     push ebx
    83.     call [ExitProcess]
    84.  
    85. ;--------------------
    86.  
    87. proc ChangeVolume
    88.  
    89.     xor ebx, ebx
    90.  
    91.     push ebx
    92.     push ebx
    93.     push ebx
    94.     push ebx
    95.     push hMixer
    96.     call [mixerOpen]
    97.     test eax, eax
    98.     jnz exitproc
    99.  
    100.     mov [ml.cbStruct], sizeof.MIXERLINE
    101.     mov [ml.dwComponentType], 4
    102.  
    103.     push 3
    104.     push ml
    105.     push [hMixer]
    106.     call [mixerGetLineInfo]
    107.     test eax, eax
    108.     jnz exitproc
    109.  
    110.     mov [mlc.cbStruct], sizeof.MIXERLINECONTROLS
    111.     mov eax, [ml.dwLineId]
    112.     mov [mlc.dwLineId], eax
    113.     mov [mlc.dwControlType], 20010002h
    114.     mov [mlc.cControls], 1
    115.     mov [mlc.cbmxctrl], sizeof.MIXERCONTROL
    116.     mov [mlc.pamxctrl], mc
    117.     mov [mc.cbStruct], sizeof.MIXERCONTROL
    118.  
    119.     push 2
    120.     push mlc
    121.     push [hMixer]
    122.     call [mixerGetLineControls]
    123.     test eax, eax
    124.     jnz exitproc
    125.  
    126.     mov [mcd.cbStruct], sizeof.MIXERCONTROLDETAILS
    127.     mov [mcd.cbDetails], 4
    128.     mov [mcd.paDetails], dwD
    129.     mov eax, [mc.dwControlId]
    130.     mov [mcd.dwControlId], eax
    131.     mov [mcd.cChannels], 1
    132.  
    133.     push ebx
    134.     push mcd
    135.     push [hMixer]
    136.     call [mixerGetControlDetails]
    137.     test eax, eax
    138.     jnz exitproc
    139.  
    140.     ;; СЮДА УЖЕ НЕ ИДЕТ. ОШИБКА
    141.  
    142.  
    143.     mov eax, [dwD]
    144.     mov eax, 0
    145.     mov [dwD], eax
    146.  
    147.     push ebx
    148.     push mcd
    149.     push [hMixer]
    150.     call [mixerSetControlDetails]
    151.        
    152.     push [hMixer]
    153.     call [mixerClose]
    154.  
    155. exitproc:
    156.  
    157.     ret
    158.  
    159. endp
    160.  
    161. ;--------------------
    162.  
    163. section '.idata' import data readable writeable
    164.  
    165.     library\
    166.     kernel32, 'kernel32.dll',\
    167.     user32, 'user32.dll',\
    168.     gdi32, 'gdi32.dll',\
    169.     winmm, 'winmm.dll'
    170.  
    171.     import winmm,\
    172.     mixerOpen, 'mixerOpen',\
    173.     mixerClose, 'mixerClose',\
    174.     mixerGetLineInfo, 'mixerGetLineInfoA',\
    175.     mixerGetLineControls, 'mixerGetLineControlsA',\
    176.     mixerGetControlDetails, 'mixerGetControlDetailsA',\
    177.     mixerSetControlDetails, 'mixerSetControlDetails'   
    178.  
    179. include 'include\apia\kernel32.inc'
    180. include 'include\apia\user32.inc'
    181. include 'include\apia\gdi32.inc'
     
  2. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Все дело в том, что ты работаешь с выключением звука (MIXERCONTROL_CONTROLTYPE_MUTE)
    А по терминологии Microsoft (да и вообще логично), когда звук выключен то в переменной должно быть TRUE
    Соответственно:
    вместо -- mov eax, 0
    надо -- mov eax, 1

    P.S. Ошибок нет. Все работает.
     
  3. Land12

    Land12 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    3
    GMax
    Спасибо за ответ. Ты выполнял этот код? Если да, то я ничего не понимаю - mixerGetControlDetails у меня возвращает 1, т.е. ошибку и ничего не изменяет, только что проверил.
    Да, насчет mov eax, 0 - действительно косяк, но управление до него все равно не доходит.
     
  4. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Land12
    Код на моей машине выполняется правильно (оба варианта).
    Может дело в версии Fasm? Твой код компилил версией 1.67
    Лично мне Masm больше нравится
     
  5. Land12

    Land12 New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2007
    Сообщения:
    3
    GMax
    Да, 1.67. Я сначала думал о выравнивании структур и их размере, но в отладчике все как и в сишном варианте.
    Видно, надо будет действительно на MASM'е писать.