Subversion Repositories Kolibri OS

Rev

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