Subversion Repositories Kolibri OS

Rev

Rev 5458 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; 1.0.1
  2.  
  3.  DEBUG equ 0
  4.  WIN_SIZE equ 120
  5.  TIMER equ 60
  6.  
  7.     use32
  8.     org     0
  9.     db      'MENUET01'
  10.     dd      1, daemon_entry, @end, @memory, @stack, @params, 0
  11.  
  12.     include "../../macros.inc"
  13.     include "../../proc32.inc"
  14.     include "../../dll.inc"
  15. if DEBUG eq 1
  16.     include "../../debug.inc"
  17. end if
  18. ;=====================================================================
  19.  
  20.  daemon_entry:
  21.     mcall   68, 11
  22.     mcall   68, 22, shm_name, 512, 5
  23.     mov     [shm], eax
  24.  
  25.     mcall   9, buffer, -1
  26.     mov     esi, dword[buffer + 30]
  27.     mov     edi, eax
  28.  
  29.   @@:
  30.     mcall   9, buffer, edi
  31.     cmpe    dword[buffer + 30], esi, .next
  32.     cmpe    dword[buffer + 10], dword "@Vol", open_1
  33.     cmpe    dword[buffer + 10], dword "@VOL", open_1
  34.     cmpe    dword[buffer + 10], dword "@vol", open_1
  35. if DEBUG eq 1
  36.     cmpe    dword[buffer + 10], dword "Volu", open_1
  37.     cmpe    dword[buffer + 10], dword "VOLu", open_1
  38.     cmpe    dword[buffer + 10], dword "volu", open_1
  39. end if
  40.  .next:
  41.     dec     edi
  42.     jnz     @b
  43.  
  44.     mov     eax, [shm]
  45.     mov     [eax], dword 0
  46.     mcall   40, 10b
  47.     mcall   66, 1, 1
  48.     mcall   66, 4, 77, 0x110
  49.     mcall   66, 4, 75, 0x110
  50.     mcall   66, 4, 80, 0x110
  51. if DEBUG eq 1
  52.     mcall   66, 4, 16, 0x110
  53. end if
  54.  
  55.     stdcall dll.Load, @imports
  56.     stdcall dword[img.decode], icons, icons.size, 0
  57.     mov     dword[image.data], eax
  58.     stdcall dword[img.to_rgb], dword[image.data], image
  59.     stdcall dword[img.destroy], dword[image.data]
  60.  
  61.  ; load driver
  62.     mcall   68, 16, snd_driver.name
  63.     mov     [snd_driver], eax
  64.     cmpe    eax, 0, exit
  65.  
  66.     mcall   70, is_load
  67.     cmpe    eax, 0, @f
  68.     mov     dword[volume], 5
  69.   @@:
  70.     mcall   70, is_save
  71.     call    set_sound_proc
  72.  
  73.  update:
  74.     mcall   23, 5
  75.     cmpe    al, EV_KEY, key
  76.     mov     eax, [shm]
  77.     cmpne   [eax], dword 0, open_2
  78.     jmp     update
  79.  
  80.  open_1:
  81.     mov     ebx, 1
  82.     cmpne   [@params], byte '+', @f
  83.     mov     ebx, 2
  84.   @@:
  85.     cmpne   [@params], byte '-', @f
  86.     mov     ebx, 3
  87.   @@:
  88.     cmpne   [@params], byte 'm', @f
  89.     mov     ebx, 4
  90.   @@:
  91.     mov     eax, [shm]
  92.     mov     [eax], ebx
  93.     jmp     exit
  94.  
  95.  open_2:
  96.     mov     eax, [shm]
  97.     mov     ebx, [eax]
  98.     mov     [command], ebx
  99.     mov     [eax], dword 0
  100.     cmpne   [win.pid], dword 0, update
  101.     mcall   51, 1, _entry, _stack
  102.     jmp     update
  103.  
  104.  key:
  105.     mcall   2
  106. if DEBUG
  107.     cmpe    ah, 16, exit
  108. end if
  109.     mov     edx, [shm]
  110.     cmpne   ah, 77, @f
  111.  .cm_1:
  112.     cmpne   [win.pid], 0, .else_1
  113.     mov     [edx], dword 2
  114.     jmp     open_2
  115.  .else_1:
  116.     mov     [command], 2
  117.   @@:
  118.     cmpne   ah, 75, @f
  119.  .cm_2:
  120.     cmpne   [win.pid], 0, .else_2
  121.     mov     [edx], dword 3
  122.     jmp     open_2
  123.  .else_2:
  124.     mov     [command], 3
  125.   @@:
  126.     cmpne   ah, 80, @f
  127.  .cm_3:
  128.     mov     [edx], dword 4
  129.     jmp     open_2
  130.   @@:
  131.     jmp     update
  132.  
  133.  exit:
  134. if DEBUG eq 1
  135.     dps     "EXIT"
  136. end if
  137.     mcall   -1
  138.  
  139. ;=====================================================================
  140.  
  141.  _entry:
  142.     mcall   40, 100111b
  143.  
  144.     mcall   9, buffer, -1
  145.     mov     ecx, eax
  146.     mov     edx, dword [buffer + 30]
  147.     mov     [win.pid], edx
  148.  
  149.     mcall   14
  150.     movzx   ebx, ax
  151.     shr     eax, 17
  152.     shr     ebx, 1
  153.     sub     eax, WIN_SIZE / 2
  154.     sub     ebx, WIN_SIZE / 2
  155.     mov     [win.x], eax
  156.     mov     [win.y], ebx
  157.  
  158.     mcall   70, is_load
  159.     cmpe    eax, 0, @f
  160.     mov     dword[volume], 5
  161.   @@:
  162.     mov     dword[timer], TIMER
  163.  
  164.     jmp     set_sound
  165.  
  166.  ;----------------------------
  167.  
  168.  _update:
  169.     mcall   23, 5
  170.     cmpe    al, EV_REDRAW, _redraw
  171.     cmpe    al, EV_KEY, _key
  172.     cmpe    al, EV_BUTTON, _button
  173.     cmpe    al, EV_MOUSE, _mouse
  174.  
  175.     cmpne   [command], 2, @f
  176.     mov     [mute], 0
  177.     cmpe    [volume], dword 10, @f
  178.     inc     dword[volume]
  179.     jmp     .apply
  180.   @@:
  181.     cmpne   [command], 3, @f
  182.     mov     [mute], 0
  183.     cmpe    [volume], dword 0, @f
  184.     dec     dword[volume]
  185.     jmp     .apply
  186.   @@:
  187.     cmpne   [command], 4, @f
  188.     mov     eax, 1
  189.     sub     eax, [mute]
  190.     mov     [mute], eax
  191.     jmp     .apply
  192.  
  193.  .apply:
  194.     mov     [command], 0
  195.     jmp     set_sound
  196.   @@:
  197.  
  198.     mcall   18, 7
  199.     mov     ecx, eax
  200.     mcall   9, buffer
  201.     mov     eax, dword[buffer + 30]
  202.     cmpne   [win.pid], eax, _exit
  203.  
  204.     dec     dword[timer]
  205.     jnz     _update
  206.  
  207.  ;----------------------------
  208.  
  209.  _exit:
  210. if DEBUG eq 1
  211.     dps     "CLOSE"
  212. end if
  213.     mov     [win.pid], 0
  214.     mcall   70, is_save
  215.     mcall   -1
  216.  
  217.  ;----------------------------
  218.  
  219.  _button:
  220.     mcall   17
  221.     cmpe    ah, 1, _exit
  222.     cmpe    ah, 3, toggle_mute
  223.     jmp     _update
  224.  
  225.  ;----------------------------
  226.  
  227.  _key:
  228.     mcall   2
  229.     cmpe    ah, 027, _exit
  230.     cmpe    ah, 176, dec_volume ; <-
  231.     cmpe    ah, 183, dec_volume ; PgDown
  232.     cmpe    ah, 179, inc_volume ; ->
  233.     cmpe    ah, 184, inc_volume ; PgUp
  234.     cmpe    ah, 178, unmute_volume ; ^
  235.     cmpe    ah, 180, unmute_volume ; Home
  236.     cmpe    ah, 177, toggle_mute ; v
  237.     cmpe    ah, 181, toggle_mute ; End
  238.  
  239.     jmp     _update
  240.  
  241.  ;----------------------------
  242.  
  243.  _mouse:
  244.     mcall   37, 7
  245.     cmpe    eax, 0, _update
  246.  
  247.     mov     esi, eax
  248.     mcall   37, 1
  249.     movzx   ebx, ax
  250.     shr     eax, 16
  251.     cmpg    eax, WIN_SIZE, _update
  252.     cmpg    ebx, WIN_SIZE, _update
  253.  
  254.     cmpe    si, 1,  dec_volume
  255.     jne     inc_volume
  256.  
  257.  ;----------------------------
  258.  
  259.  dec_volume:
  260.     cmpe    dword[volume], 0, _update
  261.     dec     dword[volume]
  262.     jmp     unmute_volume
  263.  
  264.  inc_volume:
  265.     cmpe    dword[volume], 10, _update
  266.     inc     dword[volume]
  267.     jmp     unmute_volume
  268.  
  269.  toggle_mute:
  270.     mov     eax, 1
  271.     sub     eax, [mute]
  272.     mov     [mute], eax
  273.     jmp     @f
  274.  
  275.  unmute_volume:
  276.     mov     dword[mute], 0
  277.  
  278.  set_sound:
  279.   @@:
  280.     call    set_sound_proc
  281.     mov     dword[timer], TIMER
  282.     call    draw_icon
  283.     call    draw_bar
  284.     jmp     _update
  285.  
  286.  set_sound_proc:
  287.     mov     [snd_driver.command], 6
  288.     mov     [snd_driver.inputsz], 4
  289.     mov     [snd_driver.output], 0
  290.     mov     [snd_driver.outputsz], 0
  291.     mov     [snd_driver.input], buffer
  292.     mov     edi, 10
  293.     cmpe    [mute], 1, .set_sound
  294.     sub     edi, [volume]
  295.   .set_sound:
  296.     imul    edi, 479
  297.     neg     edi
  298.     mov     dword[buffer], edi
  299.     mcall   68, 17, snd_driver
  300.     ret
  301.  
  302.  ;----------------------------
  303.  
  304.  _redraw:
  305.     call    draw_window
  306.     call    draw_icon
  307.     call    draw_bar
  308.  
  309.     jmp     _update
  310.  
  311.  ;----------------------------
  312.  
  313.  draw_window:
  314.     mcall   0, <[win.x], WIN_SIZE + 1>, <[win.y], WIN_SIZE + 1>, 0x61000000
  315.  
  316.     mcall   13, <0, WIN_SIZE>, <1, WIN_SIZE - 2>, 0x3D3D3D
  317.     mcall     , <1, WIN_SIZE - 2>, <0, 1>
  318.     mcall     ,                  , <WIN_SIZE - 1, 1>
  319.  
  320.     mcall   8, <0, WIN_SIZE>, <0, WIN_SIZE>, 0x60000002
  321.     mcall    , <20, 80>, <22, 60>, 0x60000003
  322.  
  323.     ret
  324.  
  325.  ;----------------------------
  326.  
  327.  draw_icon:
  328.     mcall   7, image, <30, 45>, <31, 30>
  329.  
  330.     cmpe    dword[mute], 0, @f
  331.     mov     ebx, 30 * 45 * 3 * 5 + image
  332.     jmp     .draw
  333.   @@:
  334.     cmpne   dword[volume], 0, @f
  335.     mov     ebx, 30 * 45 * 3 * 1 + image
  336.     jmp     .draw
  337.   @@:
  338.     cmpge  dword[volume], 5, @f
  339.     mov     ebx, 30 * 45 * 3 * 2 + image
  340.     jmp     .draw
  341.   @@:
  342.     cmpge  dword[volume], 9, @f
  343.     mov     ebx, 30 * 45 * 3 * 3 + image
  344.     jmp     .draw
  345.   @@:
  346.     mov     ebx, 30 * 45 * 3 * 4 + image
  347.  .draw:
  348.     mcall    ,      ,         , <61, 30>
  349.  
  350.     ret
  351.  
  352.  ;----------------------------
  353.  
  354.  draw_bar:
  355.  ;; draw shadow
  356.     mov     eax, 13
  357.     mov     ebx, 11 shl 16 + 9
  358.     mov     ecx, 100 shl 16 + 1
  359.     mov     edx, 0x252525
  360.     mov     esi, 10
  361.   @@:
  362.     cmpe    esi, 0, @f
  363.     mcall
  364.     add     ebx, 10 shl 16
  365.     dec     esi
  366.     jmp     @b
  367.   @@:
  368.  
  369.  ;; draw active
  370.     mov     ebx, 11 shl 16 + 9
  371.     mov     ecx, 96 shl 16 + 4
  372.     mov     edx, 0xE5E5E5
  373.     mov     esi, [volume]
  374.   @@:
  375.     cmpe    esi, 0, @f
  376.     mcall
  377.     add     ebx, 10 shl 16
  378.     dec     esi
  379.     jmp     @b
  380.   @@:
  381.  
  382.  ;; draw inactive
  383.     mov     ebx, 11 shl 16 + 9
  384.     mov     edx, 0x737373
  385.     mov     esi, 10
  386.     sub     esi, [volume]
  387.     imul    edi, [volume], 10
  388.     shl     edi, 16
  389.     add     ebx, edi
  390.   @@:
  391.     cmpe    esi, 0, @f
  392.     mcall
  393.     add     ebx, 10 shl 16
  394.     dec     esi
  395.     jmp     @b
  396.   @@:
  397.  
  398.     ret
  399.  
  400.  ;----------------------------
  401.  
  402.  @imports:
  403.     library img, "libimg.obj"
  404.     import  img, \
  405.         img.init,    "lib_init", \
  406.         img.to_rgb,  "img_to_rgb2", \
  407.         img.decode,  "img_decode", \
  408.         img.destroy, "img_destroy"
  409.  
  410.  ;----------------------------
  411.  
  412.  volume_dat db "/sys/settings/volume.dat", 0
  413.  
  414.  is_save:
  415.             dd 2
  416.             dd 0
  417.             dd 0
  418.             dd 8
  419.             dd volume
  420.             db 0
  421.             dd volume_dat
  422.  
  423.  is_load:
  424.             dd 0
  425.             dd 0
  426.             dd 0
  427.             dd 8
  428.             dd volume
  429.             db 0
  430.             dd volume_dat
  431.  
  432.  icons      file "icon.png"
  433.   .size     = $-icons
  434.  snd_driver.name:
  435.             db "SOUND", 0
  436.  shm_name   db "volume-man", 0
  437.  
  438.  @end:
  439.  
  440. ;=====================================================================
  441.  
  442.  win:
  443.   .x        rd 1
  444.   .y        rd 1
  445.   .pid      rd 1
  446.  
  447.  image      rb 45 * 30 * 6 * 3
  448.   .data     rd 1
  449.  
  450.  shm        rd 1
  451.  volume     rd 1
  452.  timer      rd 1
  453.  mute       rd 1
  454.  command    rd 1
  455.  buffer     rb 1024
  456.  snd_driver rd 1
  457.   .command  rd 1
  458.   .input    rd 1
  459.   .inputsz  rd 1
  460.   .output   rd 1
  461.   .outputsz rd 1
  462.  
  463. ;=====================================================================
  464.             rb 2048
  465.  _stack:
  466.             rb 2048
  467.  @stack:
  468.  @params    rb 256
  469.  
  470.  @memory:
  471.