Несколько способов проиграть MP3-файлы в x64

Тема в разделе "WASM.AUDIO", создана пользователем Mikl___, 5 фев 2022.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    MCI (Media Control Interface, интерфейс управления аудио-/видео-устройствами) ― универсальный интерфейс, независимый от особенностей аппаратного обеспечения, предназначен для управления аудио-/видео-устройствами. Функции MCI-интерфейса экспортируются из mmsystem.dll. Используются два типа MCI-интерфейса:
    1. интерфейс управляющих строк (Command-String Interface), основан на использовании текстовых команд ("open", "play", "close" и т.д.)
    2. интерфейс управляющих сообщений (Command-Message Interface). Для управления устройствам посылаются сообщения (MCI_OPEN, MCI_PLAY, MCI_CLOSE и т.д.)

    mci_SendString

    здесь полный текст программы. Файл 02.mp3 лежит в том же каталоге, что и программа, можно добавить OpenFile диалог для выбора mp3-файлов
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_MENU    equ 37
    4. IDM_OPEN_MP3 equ 100
    5. IDM_PLAY_MP3 equ 101
    6. IDM_QUIT equ 102
    7. IDM_CLOSE_MP3 equ 103
    8. IDM_STOP_MP3 equ 104
    9. .code
    10. WinMain proc
    11. local msg:MSG
    12.      xor ebx,ebx
    13.      mov esi,IMAGE_BASE
    14.      mov edi,offset ClassName
    15.      mov ecx,offset CursorName
    16.      invoke LoadCursorFromFile
    17.      push rax ;hIconSm
    18.      push rdi ;lpszClassName
    19.      push IDM_MENU
    20.      push COLOR_WINDOW;hbrBackground
    21.      push rax ;hCursor
    22.      push rax    ;hIcon
    23.      push rsi ;hInstance
    24.      push rbx    ;cbClsExtra & cbWndExtra
    25.      pushaddr WndProc  ;lpfnWndProc
    26.      push sizeof WNDCLASSEX;cbSize & style
    27.      invoke RegisterClassEx,esp ;addr WNDCLASSEX
    28.      push rbx
    29.      push rsi ;rsi=400000h
    30.      shl esi,9 ;rsi=CW_USEDEFAULT
    31.      push rbx
    32.      push rbx
    33.      push 200; высота окна
    34.      push 400;ширина окна
    35.      push rsi
    36.      push rsi
    37.      sub esp,20h
    38.      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    39.      invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi
    40.      invoke GetMenu,eax
    41.      mov hMenu,rax
    42.      lea edi,msg
    43. @@: invoke GetMessage,edi,NULL,0,0
    44.      invoke DispatchMessage,edi
    45.      jmp @b
    46. WinMain endp
    47. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    48.      cmp edx,WM_CLOSE
    49.      je wmCLOSE
    50.      cmp edx,WM_COMMAND
    51.      je wmCOMMAND
    52.      leave
    53.      jmp NtdllDefWindowProc_
    54. wmCLOSE:invoke RtlExitUserProcess,NULL
    55. wmCOMMAND:cmp r8d,IDM_PLAY_MP3
    56.      jne @f
    57.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_ENABLED
    58.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    59.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    60.      mov ecx,offset cmd_play
    61.      jmp @1
    62. @@:  cmp r8d,IDM_OPEN_MP3
    63.      jne @f
    64.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    65.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    66.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_GRAYED
    67.      mov ecx,offset cmd_open
    68.      jmp @1
    69. @@:  cmp r8d,IDM_QUIT
    70.      jne @f
    71.      invoke SendMessage,,WM_SYSCOMMAND,SC_CLOSE,NULL
    72.      jmp wmBYE
    73. @@:  cmp r8d,IDM_STOP_MP3
    74.      jne @f
    75.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    76.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    77.      mov ecx,offset cmd_stop
    78.      jmp @1
    79. @@:  cmp r8d,IDM_CLOSE_MP3
    80.      jne wmBYE
    81.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_GRAYED
    82.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    83.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    84.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_ENABLED
    85.      mov ecx,offset cmd_close
    86. @1:  invoke mciSendString,,0,0,0
    87. wmBYE: leave
    88.      retn
    89. WndProc endp
    90. .data
    91. ClassName  db "Uncle Remus tales: mciSendString",0
    92. CursorName db "br_Rabbit3.cur",0
    93. cmd_open   db 'open 02.mp3 type MPEGVideo Alias MP3',0
    94. cmd_play   db 'play MP3',0
    95. cmd_stop   db 'stop MP3',0
    96. cmd_close  db 'close MP3',0
    97. hMenu dq ?
    98. end
    rc-файл
    Код (Text):
    1. #include "resource.h"
    2. #define IDM_MENU     37
    3. #define IDM_OPEN_MP3 100
    4. #define IDM_PLAY_MP3 101
    5. #define IDM_QUIT 102
    6. #define IDM_CLOSE_MP3 103
    7. #define IDM_STOP_MP3 104
    8. IDM_MENU MENU
    9. BEGIN
    10.     POPUP "MP3-Files"
    11.     BEGIN
    12.       MENUITEM  "Open",IDM_OPEN_MP3
    13.       MENUITEM  "Play",IDM_PLAY_MP3,GRAYED
    14.       MENUITEM  "Pause",IDM_STOP_MP3,GRAYED
    15.       MENUITEM  "Close",IDM_CLOSE_MP3,GRAYED
    16.       MENUITEM  SEPARATOR
    17.       MENUITEM  "Exit",IDM_QUIT
    18.     END
    19. END

    mci_Execute

    программа аналогична mci_SendString, поэтому только фрагмент
    Код (ASM):
    1.  . . .
    2. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    3.      cmp edx,WM_CLOSE
    4.      je wmCLOSE
    5.      cmp edx,WM_COMMAND
    6.      je wmCOMMAND
    7.      leave
    8.      jmp NtdllDefWindowProc_
    9. wmCLOSE:invoke RtlExitUserProcess,NULL
    10. wmCOMMAND:cmp r8d,IDM_PLAY_MP3
    11.      jne @f
    12.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_ENABLED
    13.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    14.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    15.      mov ecx,offset cmd_play
    16.      jmp @1
    17. @@:  cmp r8d,IDM_OPEN_MP3
    18.      jne @f
    19.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    20.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    21.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_GRAYED
    22.      mov ecx,offset cmd_open
    23.      jmp @1
    24. @@:  cmp r8d,IDM_QUIT
    25.      jne @f
    26.      invoke SendMessage,,WM_SYSCOMMAND,SC_CLOSE,NULL
    27.      jmp wmBYE
    28. @@:  cmp r8d,IDM_STOP_MP3
    29.      jne @f
    30.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    31.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    32.      mov ecx,offset cmd_stop
    33.      jmp @1
    34. @@:  cmp r8d,IDM_CLOSE_MP3
    35.      jne wmBYE
    36.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_GRAYED
    37.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    38.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    39.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_ENABLED
    40.      mov ecx,offset cmd_close
    41. @1: invoke mci_Execute
    42. wmBYE: leave
    43.      retn
    44. WndProc endp
    45. .data
    46.  . . .
    47. cmd_open    db 'open 02.mp3 type MPEGVideo Alias MP3',0
    48. cmd_play    db 'play MP3',0
    49. cmd_stop    db 'stop MP3',0
    50. cmd_close   db 'close MP3',0
    51. hMenu dq ?

    mci_SendCommand

    Код (ASM):
    1. . . .
    2. MCI_OPEN_PARMS struct
    3.     dwCallback dq ?
    4.     wDeviceID dd ?
    5.     lpstrDeviceType dq ?;
    6.     lpstrElementName dq ?;
    7.     lpstrAlias dq ?;
    8. MCI_OPEN_PARMS ends
    9.  
    10. MCI_PLAY_PARMS struct
    11.   dwCallback dq ?;
    12.   dwFrom dd ?
    13.   dwTo dd ?
    14. MCI_PLAY_PARMS ends
    15. . . .
    16. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    17.      cmp edx,WM_CLOSE
    18.      je wmCLOSE
    19.      cmp edx,WM_COMMAND
    20.      je wmCOMMAND
    21.      leave
    22.      jmp NtdllDefWindowProc_
    23. wmCLOSE:invoke RtlExitUserProcess,NULL
    24. wmCOMMAND:cmp r8d,IDM_PLAY_MP3
    25.      jne @f
    26.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_ENABLED
    27.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    28.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    29.      mov ecx,mciOpenParms.wDeviceID
    30.      lea r9d,mciPlayParms
    31.      invoke mciSendCommand,,MCI_PLAY,MCI_NOTIFY
    32.      jmp wmBYE
    33. @@:  cmp r8d,IDM_OPEN_MP3
    34.      jne @f
    35.      mov mciPlayParms.dwCallback,rcx
    36.      movr mciOpenParms.lpstrDeviceType,Mp3Device
    37.      movr mciOpenParms.lpstrElementName,NameOfFile
    38.      lea r9d,mciOpenParms
    39.      invoke mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT
    40.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    41.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    42.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_GRAYED
    43.      jmp wmBYE
    44. @@:  cmp r8d,IDM_QUIT
    45.      jne @f
    46.      invoke SendMessage,,WM_SYSCOMMAND,SC_CLOSE,NULL
    47.      jmp wmBYE
    48. @@:  cmp r8d,IDM_STOP_MP3
    49.      jne @f
    50.      mov ecx,mciOpenParms.wDeviceID
    51.      invoke mciSendCommand,,MCI_PAUSE,MCI_WAIT,0
    52.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    53.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    54.      jmp wmBYE
    55. @@:  cmp r8d,IDM_CLOSE_MP3
    56.      jne wmBYE
    57.      mov ecx,mciOpenParms.wDeviceID
    58.      invoke mciSendCommand,,MCI_CLOSE,0,0
    59.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    60.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_GRAYED
    61.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    62.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_ENABLED
    63. wmBYE: leave
    64.      retn
    65. WndProc endp
    66. .data
    67. . . .
    68. mciOpenParms MCI_OPEN_PARMS <>
    69. mciPlayParms MCI_PLAY_PARMS <>
    70. Mp3Device db "MPEGVideo",0
    71. NameOfFile db "02.mp3",0
    72. hMenu dq ?

    MCI_Wnd

    фрагмент программы
    Код (ASM):
    1.  . . .
    2. MCIWNDM_OPEN equ WM_USER + 153
    3. . . .
    4. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    5.      cmp edx,WM_CLOSE
    6.      je wmCLOSE
    7.      cmp edx,WM_COMMAND
    8.      je wmCOMMAND
    9.      cmp edx,WM_CREATE
    10.      je wmCREATE
    11.      leave
    12.      jmp NtdllDefWindowProc_
    13. wmCLOSE:invoke RtlExitUserProcess,NULL
    14. wmCREATE:invoke MCIWndCreate,,IMAGE_BASE,WS_CHILD,0
    15.      mov hwndMovie,rax
    16.      jmp wmBYE
    17. wmCOMMAND:cmp r8d,IDM_PLAY_MP3
    18.      jne @f
    19.      invoke SendMessage,hwndMovie,MCI_PLAY,0,0
    20.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_ENABLED
    21.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    22.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    23.      jmp wmBYE
    24. @@:  cmp r8d,IDM_OPEN_MP3
    25.      jne @f
    26.      mov r9d,offset NameOfFile
    27.      invoke SendMessage,hwndMovie,MCIWNDM_OPEN,0
    28.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    29.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_ENABLED
    30.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_GRAYED
    31.      jmp wmBYE
    32. @@:  cmp r8d,IDM_QUIT
    33.      jne @f
    34.      invoke SendMessage,,WM_SYSCOMMAND,SC_CLOSE,NULL
    35.      jmp wmBYE
    36. @@:  cmp r8d,IDM_STOP_MP3
    37.      jne @f
    38.      invoke SendMessage,hwndMovie,MCI_PAUSE,0,0
    39.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    40.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_ENABLED
    41.      jmp wmBYE
    42. @@:  cmp r8d,IDM_CLOSE_MP3
    43.      jne wmBYE
    44.      invoke SendMessage,hwndMovie,MCI_CLOSE,0,0
    45.      invoke EnableMenuItem,hMenu,IDM_CLOSE_MP3,MF_GRAYED
    46.      invoke EnableMenuItem,hMenu,IDM_PLAY_MP3,MF_GRAYED
    47.      invoke EnableMenuItem,hMenu,IDM_STOP_MP3,MF_GRAYED
    48.      invoke EnableMenuItem,hMenu,IDM_OPEN_MP3,MF_ENABLED
    49. wmBYE: leave
    50.      retn
    51. WndProc endp
    52. .data
    53.  . . .
    54. hwndMovie dq ?
    55. NameOfFile db "02.mp3",0
    56. hMenu dq ?
    Во вложении asm/rc/exe/cur/mp3-файлы
    К сожалению, здесь приведена только работа с mp3-файлом и я не нашел, как напрямую работать с mp3 в ресурсах или в памяти, не создавая для этого временные файлы...
     

    Вложения:

    • mp3.zip
      Размер файла:
      3,7 МБ
      Просмотров:
      221
    DOSAsm386 и Aiks нравится это.