Subversion Repositories Kolibri OS

Rev

Rev 2991 | Rev 5273 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2006-2014. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. ; Serge 2006-2008
  9. ; email: infinity_sound@mail.ru
  10.  
  11. format PE DLL native 0.05
  12. entry START
  13.  
  14. DEBUG             equ 1
  15.  
  16.  
  17. CURRENT_API     equ   0x0101      ;1.01
  18. COMPATIBLE_API  equ   0x0100      ;1.00
  19.  
  20. API_VERSION     equ   (COMPATIBLE_API shl 16) or CURRENT_API
  21. SOUND_VERSION   equ   CURRENT_API
  22.  
  23.  
  24. FORCE_MMX         equ 0  ;set to 1 to force use mmx or
  25. FORCE_MMX_128     equ 0  ;integer sse2 extensions
  26.                          ;and reduce driver size
  27.  
  28. ;USE_SSE          equ 0
  29.  
  30. USE_SSE2_MIXER    equ 0  ;floating point mixer. Disabled by default
  31.  
  32. OS_BASE           equ 0x80000000
  33.  
  34. CAPS_SSE2         equ 26
  35. PG_SW             equ 0x003
  36.  
  37. RT_INP_EMPTY      equ 0xFF000001
  38. RT_OUT_EMPTY      equ 0xFF000002
  39. RT_INP_FULL       equ 0xFF000003
  40. RT_OUT_FULL       equ 0xFF000004
  41.  
  42. EVENT_WATCHED     equ 0x10000000
  43. EVENT_SIGNALED    equ 0x20000000
  44. MANUAL_RESET      equ 0x40000000
  45. MANUAL_DESTROY    equ 0x80000000
  46.  
  47. DEV_PLAY          equ 1
  48. DEV_STOP          equ 2
  49. DEV_CALLBACK      equ 3
  50. DEV_GET_POS       equ 9
  51.  
  52. section '.flat' code readable executable
  53. include '../../struct.inc'
  54. include '../../macros.inc'
  55. include '../../proc32.inc'
  56. include 'main.inc'
  57. include '../../peimport.inc'
  58.  
  59.  
  60.  
  61. proc START c uses ebx esi edi, state:dword, cmdline:dword
  62.  
  63.         cmp     [state], 1
  64.         jne     .exit
  65.  
  66.         invoke  GetService, szSound
  67.         test    eax, eax
  68.         jz      .fail
  69.         mov     [hSound], eax
  70.  
  71.         invoke  KernelAlloc, 16*512
  72.         test    eax, eax
  73.         jz      .out_of_mem
  74.         mov     [mix_buff], eax
  75.  
  76.         mov     eax, str.fd-FD_OFFSET
  77.         mov     [str.fd], eax
  78.         mov     [str.bk], eax
  79.  
  80. if FORCE_MMX
  81.  if FORCE_MMX_128
  82.   display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10
  83.   stop
  84.  end if
  85.         mov     [mix_2_core], mmx_mix_2
  86.         mov     [mix_3_core], mmx_mix_3
  87.         mov     [mix_4_core], mmx_mix_4
  88. end if
  89.  
  90. if FORCE_MMX_128
  91.  if FORCE_MMX
  92.   display 'Use only FORCE_MMX or FORCE_MMX_128 not both together',13,10
  93.   stop
  94.  end if
  95.         mov     [mix_2_core], mmx128_mix_2
  96.         mov     [mix_3_core], mmx128_mix_3
  97.         mov     [mix_4_core], mmx128_mix_4
  98. end if
  99.  
  100. if 0
  101.  
  102. if ~(FORCE_MMX or FORCE_MMX_128)  ;autodetect
  103.         mov     eax, 1
  104.         cpuid
  105.         bt      edx, CAPS_SSE2
  106.         jc      .mmx128
  107.                                            ;old 64-bit mmx
  108.         mov     [mix_2_core], mmx_mix_2
  109.         mov     [mix_3_core], mmx_mix_3
  110.         mov     [mix_4_core], mmx_mix_4
  111.         jmp     @F
  112. .mmx128:                                   ;128-bit integer sse2 extensions
  113.         mov     [mix_2_core], mmx128_mix_2
  114.         mov     [mix_3_core], mmx128_mix_3
  115.         mov     [mix_4_core], mmx128_mix_4
  116. @@:
  117. end if
  118.  
  119. end if
  120.         stdcall set_handler, [hSound], new_mix
  121.         mov     [eng_state], SND_STOP
  122.         invoke  RegService, szInfinity, service_proc
  123.         ret
  124. .fail:
  125.      if DEBUG
  126.         mov     esi, msgFail
  127.         invoke  SysMsgBoardStr
  128.      end if
  129. .exit:
  130.         xor     eax, eax
  131.         ret
  132.  
  133. .out_of_mem:
  134.      if DEBUG
  135.         mov     esi, msgMem
  136.         invoke  SysMsgBoardStr
  137.      end if
  138.         xor     eax, eax
  139.         ret
  140. endp
  141.  
  142. align 4
  143.  
  144. srv_calls  dd service_proc.srv_getversion       ; 0
  145.            dd service_proc.snd_create_buff      ; 1
  146.            dd service_proc.snd_destroy_buff     ; 2
  147.            dd service_proc.snd_setformat        ; 3
  148.            dd service_proc.snd_getformat        ; 4
  149.            dd service_proc.snd_reset            ; 5
  150.            dd service_proc.snd_setpos           ; 6
  151.            dd service_proc.snd_getpos           ; 7
  152.            dd service_proc.snd_setbuff          ; 8
  153.            dd service_proc.snd_out              ; 9
  154.            dd service_proc.snd_play             ; 10
  155.            dd service_proc.snd_stop             ; 11
  156.            dd service_proc.snd_setvolume        ; 12
  157.            dd service_proc.snd_getvolume        ; 13
  158.            dd service_proc.snd_setpan           ; 14
  159.            dd service_proc.snd_getpan           ; 15
  160.            dd service_proc.snd_getbuffsize      ; 16
  161.            dd service_proc.snd_getfreespace     ; 17
  162.            dd service_proc.snd_settimebase      ; 18
  163.            dd service_proc.snd_gettimestamp     ; 19
  164. srv_calls_end:
  165.  
  166. proc service_proc stdcall, ioctl:dword
  167.  
  168.         mov     edi, [ioctl]
  169.         mov     eax, [edi+IOCTL.io_code]
  170.  
  171.         cmp     eax, (srv_calls_end-srv_calls)/4
  172.         ja      .fail
  173.  
  174.         cmp     eax, SND_DESTROY_BUFF
  175.         jb      @F
  176.  
  177. ;           cmp [edi+inp_size], 4
  178. ;           jb .fali
  179.  
  180.         mov     ebx, [edi+IOCTL.input]
  181.         mov     edx, [ebx]
  182.  
  183.         cmp     [edx+STREAM.magic], 'WAVE'
  184.         jne     .fail
  185.  
  186.         cmp     [edx+STREAM.size], STREAM.sizeof
  187.         jne     .fail
  188.  
  189. @@:
  190.         jmp     [srv_calls+eax*4]
  191.  
  192.  
  193. .fail:
  194.         mov     eax, -1
  195.         ret
  196.  
  197. align 4
  198. .srv_getversion:
  199.         mov     eax, [edi+IOCTL.output]
  200.         cmp     [edi+IOCTL.out_size], 4
  201.         jne     .fail
  202.         mov     eax, [eax]
  203.         mov     [eax], dword API_VERSION
  204.         xor     eax, eax
  205.         ret
  206.  
  207. align 4
  208. .snd_create_buff:
  209.         mov     ebx, [edi+IOCTL.input]
  210.         stdcall CreateBuffer, [ebx], [ebx+4]
  211.         mov     edi, [ioctl]
  212.         mov     ecx, [edi+IOCTL.output]
  213.         mov     ecx, [ecx]
  214.         mov     [ecx], ebx
  215.         ret
  216.  
  217. align 4
  218. .snd_destroy_buff:
  219.         mov     eax, edx
  220.         call    DestroyBuffer
  221.         ret
  222.  
  223. align 4
  224. .snd_setformat:
  225.         stdcall SetFormat, edx, [ebx+4]
  226.         ret
  227.  
  228. align 4
  229. .snd_getformat:
  230.         movzx   eax, word [edx+STREAM.format]
  231.         mov     ecx, [edi+IOCTL.output]
  232.         mov     ecx, [ecx]
  233.         mov     [ecx], eax
  234.         xor     eax, eax
  235.         ret
  236.  
  237. align 4
  238. .snd_reset:
  239.         stdcall ResetBuffer, edx, [ebx+4]
  240.         ret
  241.  
  242. align 4
  243. .snd_setpos:
  244.         stdcall SetBufferPos, edx, [ebx+4]
  245.         ret
  246.  
  247. align 4
  248. .snd_getpos:
  249.         stdcall GetBufferPos, edx
  250.         mov     edi, [ioctl]
  251.         mov     ecx, [edi+IOCTL.output]
  252.         mov     ecx, [ecx]
  253.         mov     [ecx], ebx
  254.         ret
  255.  
  256. align 4
  257. .snd_setbuff:
  258.         mov     eax, [ebx+4]
  259.         stdcall set_buffer, edx, eax, [ebx+8], [ebx+12]
  260.         ret
  261.  
  262. align 4
  263. .snd_out:
  264.         mov     eax, [ebx+4]
  265.         stdcall wave_out, edx, eax, [ebx+8]
  266.         ret
  267.  
  268. align 4
  269. .snd_play:
  270.         stdcall play_buffer, edx, [ebx+4]
  271.         ret
  272.  
  273. align 4
  274. .snd_stop:
  275.         stdcall stop_buffer, edx
  276.         ret
  277.  
  278. align 4
  279. .snd_setvolume:
  280.         stdcall SetBufferVol, edx, [ebx+4], [ebx+8]
  281.         ret
  282.  
  283. align 4
  284. .snd_getvolume:
  285.         mov     eax, [edi+IOCTL.output]
  286.         mov     ecx, [eax]
  287.         mov     eax, [eax+4]
  288.         stdcall GetBufferVol, edx, ecx, eax
  289.         ret
  290. align 4
  291. .snd_setpan:
  292.         stdcall SetBufferPan, edx, [ebx+4]
  293.         ret
  294.  
  295. align 4
  296. .snd_getpan:
  297.         mov     eax, [edx+STREAM.pan]
  298.         mov     ebx, [edi+IOCTL.output]
  299.         mov     ebx, [ebx]
  300.         mov     [ebx], eax
  301.         xor     eax, eax
  302.         ret
  303.  
  304. align 4
  305. .snd_getbuffsize:
  306.         mov     eax, [edx+STREAM.in_size]
  307.         mov     ecx, [edi+IOCTL.output]
  308.         mov     ecx, [ecx]
  309.         mov     [ecx], eax
  310.         xor     eax, eax
  311.         ret
  312.  
  313. align 4
  314. .snd_getfreespace:
  315.         test    [edx+STREAM.format], PCM_OUT
  316.         jz      .fail
  317.  
  318.         mov     ebx, [edx+STREAM.in_free]
  319.         mov     ecx, [edi+IOCTL.output]
  320.         mov     [ecx], ebx
  321.         xor     eax, eax
  322.         ret
  323. align 4
  324. .snd_settimebase:
  325.         cmp     [edi+IOCTL.inp_size], 12
  326.         jne     .fail
  327.  
  328.         mov     eax, [ebx+4]
  329.         mov     ebx, [ebx+8]
  330.  
  331.         pushfd
  332.         cli
  333.         mov     dword [edx+STREAM.time_base], eax
  334.         mov     dword [edx+STREAM.time_base+4], ebx
  335.         xor     eax, eax
  336.         mov     dword [edx+STREAM.time_stamp], eax
  337.         mov     dword [edx+STREAM.time_stamp+4], eax
  338.         popfd
  339.  
  340.         ret
  341.  
  342. align 4
  343. .snd_gettimestamp:
  344.         cmp     [edi+IOCTL.out_size], 8
  345.         jne     .fail
  346.  
  347.         pushfd
  348.         cli
  349.  
  350.         xor     ebx, ebx
  351.         push    48
  352.         push    ebx            ; local storage
  353.  
  354.         cmp     [edx+STREAM.flags], SND_STOP
  355.         je      @F
  356.  
  357.         mov     eax, esp
  358.  
  359.         push    ebx
  360.         push    ecx
  361.         push    edx
  362.         push    esi
  363.         push    edi
  364.  
  365.         push    4              ;.out_size
  366.         push    eax            ;.output
  367.         push    ebx            ;.inp_size
  368.         push    ebx            ;.input
  369.         push    DEV_GET_POS    ;.code
  370.         push    dword [hSound] ;.handle
  371.         mov     eax, esp
  372.  
  373.         invoke  ServiceHandler, eax
  374.         add     esp, 6*4
  375.  
  376.         pop     edi
  377.         pop     esi
  378.         pop     edx
  379.         pop     ecx
  380.         pop     ebx
  381.  
  382.         test    eax, eax
  383.         jz      @F
  384.  
  385.         mov     dword [esp], 0  ; clear offset
  386. @@:
  387.         mov     edi, [edi+IOCTL.output]
  388.  
  389.         emms
  390.         fild    qword [edx+STREAM.time_stamp]
  391.         fiadd   dword [esp]     ; primary buffer offset
  392.         fidiv   dword [esp+4]   ; total_samples / frequency
  393.         fadd    qword [edx+STREAM.time_base]
  394.         fstp    qword [edi]
  395.         add     esp, 8
  396.  
  397.         popfd
  398.  
  399.         xor     eax, eax
  400.         ret
  401. endp
  402.  
  403.  
  404. restore   handle
  405. restore   io_code
  406. restore   input
  407. restore   inp_size
  408. restore   output
  409. restore   out_size
  410.  
  411. align 4
  412. proc CreateBuffer stdcall, format:dword, size:dword
  413.            locals
  414.         str     dd ?
  415.              ring_size   dd ?
  416.              ring_pages  dd ?
  417.            endl
  418.  
  419.         mov     eax, [format]
  420.         cmp     ax, PCM_1_8_8
  421.         ja      .fail
  422.  
  423.         test    eax, PCM_OUT
  424.         jnz     .test_out
  425.         test    eax, PCM_RING
  426.         jnz     .test_ring
  427. ;staic
  428.         test    eax, PCM_STATIC
  429.         jz      .test_out                 ;use PCM_OUT as default format
  430.         jmp     .test_ok
  431. .test_out:
  432.         test    eax, PCM_RING+PCM_STATIC
  433.         jnz     .fail
  434.         or      [format], PCM_OUT         ;force set
  435.         jmp     .test_ok
  436. .test_ring:
  437.         test    eax, PCM_OUT+PCM_STATIC
  438.         jnz     .fail
  439. .test_ok:
  440.  
  441.         invoke  GetPid
  442.         mov     ebx, eax
  443.         mov     eax, STREAM.sizeof
  444.  
  445.         invoke  CreateObject
  446.         test    eax, eax
  447.         jz      .fail
  448.         mov     [str], eax
  449.  
  450.         mov     ebx, [format]
  451.         mov     [eax+STREAM.format], ebx
  452.  
  453.         xor     ecx, ecx
  454.         movzx   ebx, bx
  455.         cmp     ebx, 19
  456.         jb      @f
  457.         mov     ecx, 0x80808080
  458. @@:
  459.         mov     [eax+STREAM.r_silence], ecx
  460.  
  461.         shl     ebx, 2
  462.         lea     ebx, [ebx+ebx*2]    ;ebx*=12
  463.  
  464.         mov     ecx, [resampler_params+ebx]
  465.         mov     edx, [resampler_params+ebx+4]
  466.         mov     esi, [resampler_params+ebx+8]
  467.  
  468.         mov     [eax+STREAM.r_size], ecx
  469.         mov     [eax+STREAM.r_dt], edx
  470.         mov     [eax+STREAM.resample], esi
  471.         xor     ecx, ecx
  472.         mov     [eax+STREAM.l_vol], ecx
  473.         mov     [eax+STREAM.r_vol], ecx
  474.         mov     dword [eax+STREAM.l_amp], 0x7FFF7FFF
  475.         mov     [eax+STREAM.pan], ecx
  476.  
  477.         test    [format], PCM_STATIC
  478.         jnz     .static
  479.  
  480. ; ring and waveout
  481.  
  482.         mov     ebx, 0x10000
  483.         test    [format], PCM_RING
  484.         jz      .waveout
  485.  
  486.         mov     ebx, [eax+STREAM.r_size]
  487.         add     ebx, 4095
  488.         and     ebx, -4096
  489.         add     ebx, ebx
  490. .waveout:
  491.         mov     [ring_size], ebx
  492.         mov     eax, ebx
  493.         shr     ebx, 12
  494.         mov     [ring_pages], ebx
  495.  
  496.         invoke  CreateRingBuffer, eax, PG_SW
  497.  
  498.         mov     edi, [str]
  499.         mov     ecx, [ring_size]
  500.         mov     [edi+STREAM.in_base], eax
  501.         mov     [edi+STREAM.in_size], ecx
  502.         add     eax, 128
  503.         mov     [edi+STREAM.in_wp], eax
  504.         mov     [edi+STREAM.in_rp], eax
  505.         mov     [edi+STREAM.in_count], 0
  506.  
  507.         mov     [edi+STREAM.in_free], ecx
  508.         add     eax, ecx
  509.         mov     [edi+STREAM.in_top], eax
  510.  
  511.         jmp     .out_buff
  512. .static:
  513.         mov     ecx, [size]
  514.         add     ecx, 128         ;resampler required
  515.         mov     [eax+STREAM.in_size], ecx
  516.         invoke  KernelAlloc, ecx
  517.  
  518.         mov     edi, [str]
  519.         mov     [edi+STREAM.in_base], eax
  520.         add     eax, 128
  521.         mov     [edi+STREAM.in_wp], eax
  522.         mov     [edi+STREAM.in_rp], eax
  523.         mov     ebx, [size]
  524.         mov     [edi+STREAM.in_count], ebx
  525.         mov     [edi+STREAM.in_free], ebx
  526.         add     eax, ebx
  527.         mov     [edi+STREAM.in_top], eax
  528.  
  529. .out_buff:
  530.         invoke  AllocKernelSpace, dword 128*1024
  531.  
  532.         mov     edi, [str]
  533.         xor     ebx, ebx
  534.  
  535.         mov     [edi+STREAM.out_base], eax
  536.         mov     [edi+STREAM.out_wp], eax
  537.         mov     [edi+STREAM.out_rp], eax
  538.         mov     [edi+STREAM.out_count], ebx
  539.         add     eax, 64*1024
  540.         mov     [edi+STREAM.out_top], eax
  541.  
  542.         mov     dword [edi+STREAM.time_base], ebx
  543.         mov     dword [edi+STREAM.time_base+4], ebx
  544.  
  545.         mov     dword [edi+STREAM.time_stamp], ebx
  546.         mov     dword [edi+STREAM.time_stamp+4], ebx
  547.         mov     dword [edi+STREAM.last_ts], ebx
  548.  
  549.         invoke  AllocPages, dword 64/4
  550.         mov     edi, [str]
  551.         mov     ebx, [edi+STREAM.out_base]
  552.         mov     ecx, 16
  553.         or      eax, PG_SW
  554.         push    eax
  555.         push    ebx
  556.         invoke  CommitPages ;eax, ebx, ecx
  557.         mov     ecx, 16
  558.         pop     ebx
  559.         pop     eax
  560.         add     ebx, 64*1024
  561.         invoke  CommitPages    ;double mapped
  562.  
  563.         mov     edi, [str]
  564.         mov     ecx, [edi+STREAM.in_top]
  565.         mov     edi, [edi+STREAM.in_base]
  566.         sub     ecx, edi
  567.         xor     eax, eax
  568.         shr     ecx, 2
  569.         cld
  570.         rep stosd
  571.  
  572.         mov     edi, [str]
  573.         mov     edi, [edi+STREAM.out_base]
  574.         mov     ecx, (64*1024)/4
  575.         rep stosd
  576.  
  577.         xor     esi, esi
  578.         mov     ecx, MANUAL_DESTROY
  579.         invoke  CreateEvent
  580.  
  581.         mov     ebx, [str]
  582.         mov     [ebx+STREAM.notify_event], eax
  583.         mov     [ebx+STREAM.notify_id], edx
  584.  
  585.         mov     [ebx+STREAM.magic], 'WAVE'
  586.         mov     [ebx+STREAM.destroy], DestroyBuffer.destroy
  587.         mov     [ebx+STREAM.size], STREAM.sizeof
  588.         mov     [ebx+STREAM.flags], SND_STOP
  589.  
  590.         pushf
  591.         cli
  592.         mov     eax, str.fd-FD_OFFSET
  593.         mov     edx, [eax+STREAM.str_fd]
  594.         mov     [ebx+STREAM.str_fd], edx
  595.         mov     [ebx+STREAM.str_bk], eax
  596.         mov     [eax+STREAM.str_fd], ebx
  597.         mov     [edx+STREAM.str_bk], ebx
  598.         popf
  599.  
  600.         xor     eax, eax
  601.         ret
  602. .fail:
  603.         xor     ebx, ebx
  604.         or      eax, -1
  605.         ret
  606. endp
  607.  
  608. ;param
  609. ; eax= buffer handle
  610.  
  611. align 4
  612. DestroyBuffer:
  613.            .handle  equ esp       ;local
  614.  
  615.         mov     [eax+STREAM.flags], SND_STOP
  616. .destroy:
  617.         push    eax
  618.  
  619.         pushfd
  620.         cli
  621.         mov     ebx, [eax+STREAM.str_fd]
  622.         mov     ecx, [eax+STREAM.str_bk]
  623.         mov     [ebx+STREAM.str_bk], ecx
  624.         mov     [ecx+STREAM.str_fd], ebx
  625.         popf
  626.  
  627.         invoke  KernelFree, [eax+STREAM.in_base]
  628.         mov     eax, [.handle]
  629.         invoke  KernelFree, [eax+STREAM.out_base]
  630.  
  631.         pop     eax              ;restore stack
  632.         invoke  DestroyObject    ;eax= stream
  633.         xor     eax, eax
  634.         ret
  635. .fail:
  636.         or      eax, -1
  637.         ret
  638. restore .handle
  639.  
  640. align 4
  641. proc SetFormat stdcall, str:dword, format:dword
  642.  
  643.         cmp     word [format], PCM_1_8_8
  644.         ja      .fail
  645.  
  646.         mov     edx, [str]
  647.         mov     [edx+STREAM.flags], SND_STOP
  648.  
  649.         test    [edx+STREAM.format], PCM_RING
  650.         jnz     .fail
  651.  
  652. ;           mov eax,[edx+STREAM.out_base]
  653. ;           mov [edx+STREAM.out_wp], eax
  654. ;           mov [edx+STREAM.out_rp], eax
  655. ;           mov [edx+STREAM.out_count], 0
  656.  
  657.         movzx   eax, word [format]
  658.         mov     word [edx+STREAM.format], ax
  659.  
  660.         xor     ebx, ebx
  661.         cmp     eax, 19
  662.         jb      @f
  663.         mov     ebx, 0x80808080
  664. @@:
  665.         mov     [edx+STREAM.r_silence], ebx
  666.  
  667.         shl     eax, 2
  668.         lea     eax, [eax+eax*2]    ;eax*=12
  669.  
  670.         mov     edi, [resampler_params+eax]
  671.         mov     ecx, [resampler_params+eax+4]
  672.         mov     ebx, [resampler_params+eax+8]
  673.  
  674.         mov     [edx+STREAM.r_size], edi
  675.         mov     [edx+STREAM.r_dt], ecx
  676.         mov     [edx+STREAM.resample], ebx
  677.  
  678.         mov     edi, [edx+STREAM.in_base]
  679.         mov     ecx, 128/4
  680.         mov     eax, [edx+STREAM.r_silence]
  681.         cld
  682.         rep stosd
  683.         xor     eax, eax
  684.         ret
  685. .fail:
  686.         or      eax, -1
  687.         ret
  688. endp
  689.  
  690. ; for static buffers only
  691. ; use waveout for streams
  692.  
  693. align 4
  694. proc set_buffer stdcall, str:dword,src:dword,offs:dword,size:dword
  695.  
  696.         mov     edx, [str]
  697.         test    [edx+STREAM.format], PCM_OUT
  698.         jnz     .fail
  699.  
  700.         mov     esi, [src]
  701.         mov     edi, [offs]
  702.         add     edi, [edx+STREAM.in_base]
  703.         add     edi, 128
  704.  
  705.         cmp     edi, [edx+STREAM.in_top]
  706.         jae     .fail
  707.  
  708.         mov     ecx, [size]
  709.         lea     ebx, [ecx+edi]
  710.         sub     ebx, [edx+STREAM.in_top]
  711.         jb      @F
  712.         sub     ecx, ebx
  713. @@:
  714.         shr     ecx, 2
  715.         cld
  716.         rep movsd
  717.         xor     eax, eax
  718.         ret
  719. .fail:
  720.         or      eax, -1
  721.         ret
  722. endp
  723.  
  724. ; for stream buffers only
  725.  
  726. align 4
  727. proc wave_out stdcall, str:dword,src:dword,size:dword
  728.            locals
  729.              state_saved  dd ?
  730.              fpu_state    rb 528
  731.            endl
  732.  
  733.         mov     edx, [str]
  734.         mov     eax, [edx+STREAM.format]
  735.         test    eax, PCM_OUT
  736.         jz      .fail
  737.  
  738.         cmp     ax, PCM_ALL
  739.         je      .fail
  740.  
  741.         mov     esi, [src]
  742.         test    esi, esi
  743.         jz      .fail
  744.  
  745.         cmp     esi, OS_BASE
  746.         jae     .fail
  747.  
  748.         mov     [state_saved], 0
  749.  
  750. .main_loop:
  751.         mov     edx, [str]
  752.  
  753.         mov     ebx, [size]
  754.         test    ebx, ebx
  755.         jz      .done
  756.  
  757.         cmp     [edx+STREAM.flags], SND_STOP
  758.         jne     .fill
  759.  
  760.         mov     edi, [edx+STREAM.in_base]
  761.         mov     ecx, 128/4
  762.         mov     eax, [edx+STREAM.r_silence]
  763.         cld
  764.         rep stosd
  765.  
  766.         mov     ecx, [edx+STREAM.in_size]
  767.         sub     ecx, 128
  768.         mov     [edx+STREAM.in_wp], edi
  769.         mov     [edx+STREAM.in_rp], edi
  770.         mov     [edx+STREAM.in_count], 0
  771.         mov     [edx+STREAM.in_free], ecx
  772.  
  773.         mov     eax, [edx+STREAM.out_base]
  774.         mov     [edx+STREAM.out_wp], eax
  775.         mov     [edx+STREAM.out_rp], eax
  776.         mov     [edx+STREAM.out_count], 0
  777. .fill:
  778.         cli
  779.  
  780.         mov     ecx, [edx+STREAM.in_free]
  781.         test    ecx, ecx
  782.         jz      .wait
  783.  
  784.         cmp     ecx, ebx
  785.         jbe     @F
  786.  
  787.         mov     ecx, ebx
  788. @@:
  789.         sub     [size], ecx
  790.         add     [edx+STREAM.in_count], ecx
  791.         sub     [edx+STREAM.in_free], ecx
  792.  
  793.         shr     ecx, 2
  794.         mov     edi, [edx+STREAM.in_wp]
  795.         mov     esi, [src]
  796.         cld
  797.         rep movsd
  798.  
  799.         mov     [src], esi
  800.         cmp     edi, [edx+STREAM.in_top]
  801.         jb      @F
  802.         sub     edi, [edx+STREAM.in_size]
  803. @@:
  804.         mov     [edx+STREAM.in_wp], edi
  805.  
  806.         cmp     [edx+STREAM.out_count], 32768
  807.         jae     .skip
  808.  
  809.         cmp     [state_saved], 0
  810.         jne     @F
  811.         lea     eax, [fpu_state+15]
  812.         and     eax, -16
  813.         invoke  FpuSave
  814.         mov     [state_saved], 1
  815. @@:
  816.         stdcall refill, edx
  817.  
  818. .skip:
  819.         sti
  820.         mov     edx, [str]
  821.         mov     [edx+STREAM.flags], SND_PLAY
  822.         cmp     [eng_state], SND_PLAY
  823.         je      .main_loop
  824.  
  825.         stdcall dev_play, [hSound]
  826.         mov     [eng_state], SND_PLAY
  827.         jmp     .main_loop
  828. .wait:
  829.         sti
  830.         mov     edx, [str]
  831.         mov     eax, [edx+STREAM.notify_event]
  832.         mov     ebx, [edx+STREAM.notify_id]
  833.         invoke  WaitEvent   ;eax ebx
  834.         jmp     .main_loop
  835. .done:
  836.         cmp     [state_saved], 1
  837.         jne     @F
  838.  
  839.         lea     eax, [fpu_state+15]
  840.         and     eax, -16
  841.         invoke  FpuRestore
  842. @@:
  843.         xor     eax, eax
  844.         ret
  845. .fail:
  846.         or      eax, -1
  847.         ret
  848. endp
  849.  
  850. ; both static and stream
  851. ; reset all but not clear buffers
  852.  
  853.  
  854. ; flags reserved
  855. ;  RESET_INPUT  equ 1   ;reset and clear input buffer
  856. ;  RESET_OUTPUT equ 2   ;reset and clear output buffer
  857. ;  RESET_ALL    equ 3
  858.  
  859.  
  860. align 4
  861. proc ResetBuffer stdcall, str:dword, flags:dword
  862.  
  863.         mov     edx, [str]
  864.         mov     [edx+STREAM.flags], SND_STOP
  865.  
  866.         mov     edi, [edx+STREAM.in_base]
  867.         mov     ecx, 128/4
  868.         mov     eax, [edx+STREAM.r_silence]
  869.         cld
  870.         rep stosd
  871.  
  872.         mov     [edx+STREAM.in_wp], edi
  873.         mov     [edx+STREAM.in_rp], edi
  874.  
  875.         test    [edx+STREAM.flags], PCM_STATIC
  876.         jnz     .static
  877.         mov     [edx+STREAM.in_count], 0
  878.         jmp     @F
  879. .static:
  880.         mov     eax, [edx+STREAM.in_size]
  881.         mov     [edx+STREAM.in_count], eax
  882. @@:
  883.  
  884.         mov     eax, [edx+STREAM.in_size]
  885.         sub     eax, 128
  886.         mov     [edx+STREAM.in_free], eax
  887.  
  888.         xor     eax, eax
  889.         mov     ebx, [edx+STREAM.out_base]
  890.         mov     [edx+STREAM.out_wp], ebx
  891.         mov     [edx+STREAM.out_rp], ebx
  892.         mov     [edx+STREAM.out_count], eax
  893.  
  894.         mov     dword [edx+STREAM.time_base], eax
  895.         mov     dword [edx+STREAM.time_base+4], eax
  896.  
  897.         mov     dword [edx+STREAM.time_stamp], eax
  898.         mov     dword [edx+STREAM.time_stamp+4], eax
  899.         mov     dword [edx+STREAM.last_ts], eax
  900.  
  901.  
  902.         mov     eax, [edx+STREAM.r_silence]
  903.         test    [flags], 1
  904.         jz      @F
  905.  
  906.         mov     ecx, [edx+STREAM.in_top]
  907.         mov     edi, [edx+STREAM.in_base]
  908.         sub     ecx, edi
  909.         shr     ecx, 2
  910.         cld
  911.         rep stosd
  912. @@:
  913.         test    [flags], 2
  914.         jz      @F
  915.  
  916.         mov     edi, [edx+STREAM.out_base]
  917.         mov     ecx, (64*1024)/4
  918.         rep stosd
  919. @@:
  920.         ret
  921. .fail:
  922.         or      eax, -1
  923.         ret
  924. endp
  925.  
  926. ; for static buffers only
  927.  
  928. align 4
  929. proc SetBufferPos stdcall, str:dword, pos:dword
  930.  
  931.         mov     edx, [str]
  932.         test    [edx+STREAM.format], PCM_STATIC
  933.         jz      .fail
  934.  
  935.         mov     [edx+STREAM.flags], SND_STOP
  936.  
  937.         mov     eax, [pos]
  938.         add     eax, [edx+STREAM.in_base]
  939.         mov     ebx, [edx+STREAM.in_top]
  940.         add     eax, 128
  941.  
  942.         cmp     eax, ebx
  943.         jae     .fail
  944.  
  945.         mov     [edx+STREAM.in_rp], eax
  946.         sub     ebx, eax
  947.         mov     [edx+STREAM.in_count], ebx
  948.         xor     eax, eax
  949.         ret
  950. .fail:
  951.         or      eax, -1
  952.         ret
  953. endp
  954.  
  955. align 4
  956. proc GetBufferPos stdcall, str:dword
  957.  
  958.         mov     edx, [str]
  959.         test    [edx+STREAM.format], PCM_STATIC
  960.         jz      .fail
  961.  
  962.         mov     ebx, [edx+STREAM.in_rp]
  963.         sub     ebx, [edx+STREAM.in_base]
  964.         sub     ebx, 128
  965.         xor     eax, eax
  966.         ret
  967. .fail:
  968.         xor     ebx, ebx
  969.         or      eax, -1
  970.         ret
  971. endp
  972.  
  973. ; both
  974.  
  975. align 4
  976. proc SetBufferVol stdcall, str:dword,l_vol:dword,r_vol:dword
  977.  
  978.         mov     edx, [str]
  979.         stdcall set_vol_param, [l_vol], [r_vol], [edx+STREAM.pan]
  980.         ret
  981. endp
  982.  
  983.  
  984. proc minw stdcall, arg1:dword, arg2:dword
  985.         mov     ax, word [arg1]
  986.         cmp     ax, word [arg2]
  987.         jle     @f
  988.         mov     eax, [arg2]
  989. @@:
  990.         ret
  991. endp
  992.  
  993. proc maxw stdcall, arg1:dword, arg2:dword
  994.         mov     ax, word [arg1]
  995.         cmp     ax, word [arg2]
  996.         jge     @f
  997.         mov     eax, [arg2]
  998. @@:
  999.         ret
  1000. endp
  1001.  
  1002.  
  1003. proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
  1004.            locals
  1005.              _600    dd ?
  1006.              _32767  dd ?
  1007.              state   rb 108
  1008.            endl
  1009.  
  1010.         mov     [_600], 0x44160000  ;600.0
  1011.         mov     [_32767], 32767
  1012.  
  1013.         lea     ebx, [state]
  1014.         fnsave  [ebx]
  1015.  
  1016.         stdcall minw, [l_vol], [vol_max]
  1017.         stdcall maxw, eax, [vol_min]
  1018.         mov     [l_vol], eax
  1019.         mov     [edx+STREAM.l_vol], eax
  1020.         stdcall minw, [r_vol], [vol_max+4]
  1021.         stdcall maxw, eax, [vol_min+4]
  1022.         mov     [r_vol], eax
  1023.         mov     [edx+STREAM.r_vol], eax
  1024.  
  1025.         stdcall minw, [pan], [pan_max]
  1026.         stdcall maxw, eax, [vol_min]
  1027.         mov     [edx+STREAM.pan], eax
  1028.  
  1029.         cmp     word [edx+STREAM.pan], 0
  1030.         jl      @f
  1031.  
  1032.         mov     ebx, [l_vol]
  1033.         sub     ebx, eax
  1034.         stdcall minw, ebx, [vol_max]
  1035.         stdcall maxw, eax, [vol_min]
  1036.         mov     [l_vol], eax
  1037.         jmp     .calc_amp
  1038. @@:
  1039.         mov     ebx, [r_vol]
  1040.         add     ebx, [pan]
  1041.         stdcall minw, ebx, [vol_max+4]
  1042.         stdcall maxw, eax, [vol_min+4]
  1043.         mov     [r_vol], eax
  1044. .calc_amp:
  1045.         emms
  1046.         fild    word [l_vol]
  1047.  
  1048.         call    .calc
  1049.  
  1050.         fistp   word [edx+STREAM.l_amp]
  1051.         fstp    dword [edx+STREAM.l_amp_f]
  1052.         fstp    st0
  1053.  
  1054.         fild    word [r_vol]
  1055.  
  1056.         call    .calc
  1057.  
  1058.         fistp   word [edx+STREAM.r_amp]
  1059.         fstp    dword [edx+STREAM.r_amp_f]
  1060.         fstp    st0
  1061.  
  1062.         fnclex
  1063.         lea     ebx, [state]
  1064.         frstor  [ebx]
  1065.  
  1066.         xor     eax, eax
  1067.         inc     eax
  1068.         ret
  1069. .calc:
  1070.         fdiv    dword [_600]
  1071.         fld     st0
  1072.         frndint
  1073.         fxch    st1
  1074.         fsub    st, st1
  1075.         f2xm1
  1076.         fld1
  1077.         faddp   st1, st0
  1078.         fscale
  1079.         fld     st0
  1080.         fimul   dword [_32767]
  1081.         ret     0
  1082. endp
  1083.  
  1084.  
  1085. align 4
  1086. proc GetBufferVol stdcall, str:dword,p_lvol:dword,p_rvol:dword
  1087.  
  1088.         mov     edx, [str]
  1089.         mov     eax, [p_lvol]
  1090.         movsx   ecx, word [edx+STREAM.l_vol]
  1091.         mov     [eax], ecx
  1092.  
  1093.         mov     eax, [p_rvol]
  1094.         movsx   ecx, word [edx+STREAM.r_vol]
  1095.         mov     [eax], ecx
  1096.         xor     eax, eax
  1097.         ret
  1098. endp
  1099.  
  1100. align 4
  1101. proc SetBufferPan stdcall, str:dword,pan:dword
  1102.  
  1103.         mov     edx, [str]
  1104.         stdcall set_vol_param, [edx+STREAM.l_vol], \
  1105.                 [edx+STREAM.r_vol],[pan]
  1106.         ret
  1107. endp
  1108.  
  1109. ; for static and ring buffers only
  1110.  
  1111. align 4
  1112. proc play_buffer stdcall, str:dword, flags:dword
  1113.  
  1114.         mov     ebx, [str]
  1115.         mov     eax, [ebx+STREAM.format]
  1116.         test    eax, PCM_OUT
  1117.         jnz     .fail
  1118.  
  1119.         cmp     ax, PCM_ALL
  1120.         je      .fail
  1121.  
  1122.         mov     [ebx+STREAM.flags], SND_PLAY
  1123.         cmp     [eng_state], SND_PLAY
  1124.         je      .done
  1125.  
  1126.         stdcall dev_play, [hSound]
  1127.         mov     [eng_state], SND_PLAY
  1128. .done:
  1129.         test    [flags], PLAY_SYNC
  1130.         jz      @F
  1131.  
  1132.         mov     edx, [str]
  1133. .wait:
  1134.         mov     eax, [edx+STREAM.notify_event]
  1135.         mov     ebx, [edx+STREAM.notify_id]
  1136.         invoke  WaitEvent   ;eax ebx
  1137.  
  1138.         mov     edx, [str]
  1139.         cmp     [edx+STREAM.flags], SND_STOP
  1140.         jne     .wait
  1141. @@:
  1142.         xor     eax, eax
  1143.         ret
  1144. .fail:
  1145.         or      eax, -1
  1146.         ret
  1147. endp
  1148.  
  1149. ; for static and ring buffers only
  1150.  
  1151. align 4
  1152. proc stop_buffer stdcall, str:dword
  1153.  
  1154.         mov     edx, [str]
  1155.         test    [edx+STREAM.format], PCM_STATIC+PCM_RING
  1156.         jz      .fail
  1157.  
  1158.         mov     [edx+STREAM.flags], SND_STOP
  1159.  
  1160.         mov     eax, [edx+STREAM.notify_event]
  1161.         mov     ebx, [edx+STREAM.notify_id]
  1162.         invoke  ClearEvent   ;eax ebx
  1163.  
  1164.         xor     eax, eax
  1165.         ret
  1166. .fail:
  1167.         or      eax, -1
  1168.         ret
  1169. endp
  1170.  
  1171. ; param
  1172. ;  eax= mix_list
  1173.  
  1174. align 4
  1175. do_mix_list:
  1176.  
  1177.         xor     edx, edx
  1178.         mov     esi, str.fd-FD_OFFSET
  1179.         mov     ebx, [esi+STREAM.str_fd]
  1180. @@:
  1181.         cmp     ebx, esi
  1182.         je      .done
  1183.  
  1184.         cmp     [ebx+STREAM.magic], 'WAVE'
  1185.         jne     .next
  1186.  
  1187.         cmp     [ebx+STREAM.size], STREAM.sizeof
  1188.         jne     .next
  1189.  
  1190.         cmp     [ebx+STREAM.flags], SND_PLAY;
  1191.         jne     .next
  1192.  
  1193.         mov     ecx, [ebx+STREAM.out_count]
  1194.         test    ecx, ecx
  1195.         jnz     .l1
  1196.  
  1197.         test    [ebx+STREAM.format], PCM_RING
  1198.         jnz     .next
  1199.         mov     [ebx+STREAM.flags], SND_STOP
  1200.         jmp     .next
  1201. .l1:
  1202.         cmp     ecx, 512
  1203.         jae     .add_buff
  1204.  
  1205.         mov     edi, [ebx+STREAM.out_rp]
  1206.         add     edi, ecx
  1207.         sub     ecx, 512
  1208.         neg     ecx
  1209.         push    eax
  1210.         xor     eax, eax
  1211.         cld
  1212.         rep stosb
  1213.         pop     eax
  1214.  
  1215.         mov     [ebx+STREAM.out_count], 512
  1216.  
  1217. .add_buff:
  1218.         mov     ecx, [ebx+STREAM.out_rp]
  1219.         mov     [eax], ecx
  1220.  
  1221. if USE_SSE2_MIXER
  1222.         mov     edi, dword [ebx+STREAM.l_amp_f]
  1223.         mov     [eax+4], edi
  1224.         mov     edi, dword [ebx+STREAM.r_amp_f]
  1225.         mov     [eax+8], edi
  1226. else
  1227.         mov     edi, dword [ebx+STREAM.l_amp]
  1228.         mov     [eax+4], edi
  1229. end if
  1230.         add     [ebx+STREAM.out_rp], 512
  1231.         sub     [ebx+STREAM.out_count], 512
  1232.  
  1233.         add     eax, 12
  1234.         inc     edx
  1235. .next:
  1236.         mov     ebx, [ebx+STREAM.str_fd]
  1237.         jmp     @B
  1238. .done:
  1239.         mov     eax, edx
  1240.         ret
  1241.  
  1242. align 4
  1243. prepare_playlist:
  1244.  
  1245.         xor     edx, edx
  1246.         mov     [play_count], edx
  1247.         mov     esi, str.fd-FD_OFFSET
  1248.         mov     edi, [esi+STREAM.str_fd]
  1249. @@:
  1250.         cmp     edi, esi
  1251.         je      .done
  1252.  
  1253.         cmp     [edi+STREAM.magic], 'WAVE'
  1254.         jne     .next
  1255.  
  1256.         cmp     [edi+STREAM.size], STREAM.sizeof
  1257.         jne     .next
  1258.  
  1259.         cmp     [edi+STREAM.flags], SND_PLAY;
  1260.         jne     .next
  1261.  
  1262.         mov     [play_list+edx], edi
  1263.         inc     [play_count]
  1264.         add     edx, 4
  1265. .next:
  1266.         mov     edi, [edi+STREAM.str_fd]
  1267.         jmp     @B
  1268. .done:
  1269.         ret
  1270.  
  1271. align 4
  1272. proc set_handler stdcall, hsrv:dword, handler_proc:dword
  1273.            locals
  1274.              handler    dd ?
  1275.              io_code    dd ?
  1276.              input      dd ?
  1277.              inp_size   dd ?
  1278.              output     dd ?
  1279.              out_size   dd ?
  1280.              val        dd ?
  1281.            endl
  1282.  
  1283.         mov     eax, [hsrv]
  1284.         lea     ecx, [handler_proc]
  1285.         xor     ebx, ebx
  1286.  
  1287.         mov     [handler], eax
  1288.         mov     [io_code], DEV_CALLBACK
  1289.         mov     [input], ecx
  1290.         mov     [inp_size], 4
  1291.         mov     [output], ebx
  1292.         mov     [out_size], 0
  1293.  
  1294.         lea     eax, [handler]
  1295.         invoke  ServiceHandler, eax
  1296.         ret
  1297. endp
  1298.  
  1299. align 4
  1300. proc dev_play stdcall, hsrv:dword
  1301.            locals
  1302.              handle     dd ?
  1303.              io_code    dd ?
  1304.              input      dd ?
  1305.              inp_size   dd ?
  1306.              output     dd ?
  1307.              out_size   dd ?
  1308.              val        dd ?
  1309.            endl
  1310.  
  1311.         mov     eax, [hsrv]
  1312.         xor     ebx, ebx
  1313.  
  1314.         mov     [handle], eax
  1315.         mov     [io_code], DEV_PLAY
  1316.         mov     [input], ebx
  1317.         mov     [inp_size], ebx
  1318.         mov     [output], ebx
  1319.         mov     [out_size], ebx
  1320.  
  1321.         lea     eax, [handle]
  1322.         invoke  ServiceHandler, eax
  1323.         ret
  1324. endp
  1325.  
  1326. if 0
  1327. align 4
  1328. dword2str:
  1329.         mov     esi, hex_buff
  1330.         mov     ecx, -8
  1331. @@:
  1332.         rol     eax, 4
  1333.         mov     ebx, eax
  1334.         and     ebx, 0x0F
  1335.         mov     bl, [ebx+hexletters]
  1336.         mov     [8+esi+ecx], bl
  1337.         inc     ecx
  1338.         jnz     @B
  1339.         ret
  1340.  
  1341. hexletters   db '0123456789ABCDEF'
  1342. hex_buff     db 8 dup(0),13,10,0
  1343.  
  1344. end if
  1345.  
  1346. include 'mixer.asm'
  1347. include 'mix_mmx.inc'
  1348. include 'mix_sse2.inc'
  1349.  
  1350. ;if USE_SSE
  1351. ; include 'mix_sse.inc'
  1352. ;end if
  1353.  
  1354. align 16
  1355. resampler_params:
  1356.      ;r_size    r_dt   resampler_func
  1357.      dd 0,0,0                                  ; 0  PCM_ALL
  1358.      dd 16384,      0, copy_stream    ; 1  PCM_2_16_48
  1359.      dd  8192,      0, m16_stereo     ; 2  PCM_1_16_48
  1360.  
  1361.      dd 16384,  30109, resample_2     ; 3  PCM_2_16_44
  1362.      dd  8192,  30109, resample_1     ; 4  PCM_1_16_44
  1363.  
  1364.      dd 16384,  21846, resample_2     ; 5  PCM_2_16_32
  1365.      dd  8192,  21846, resample_1     ; 6  PCM_1_16_32
  1366.  
  1367.      dd 16384,  16384, resample_2     ; 7  PCM_2_16_24
  1368.      dd  8192,  16384, resample_1     ; 8  PCM_1_16_24
  1369.  
  1370.      dd  8192,  15052, resample_2     ; 9  PCM_2_16_22
  1371.      dd  4096,  15052, resample_1     ;10  PCM_1_16_22
  1372.  
  1373.      dd  8192,  10923, resample_2     ;11  PCM_2_16_16
  1374.      dd  4096,  10923, resample_1     ;12  PCM_1_16_16
  1375.  
  1376.      dd  8192,   8192, resample_2     ;13  PCM_2_16_12
  1377.      dd  4096,   8192, resample_1     ;14  PCM_1_16_12
  1378.  
  1379.      dd  4096,   7527, resample_2     ;15  PCM_2_16_11
  1380.      dd  2048,   7527, resample_1     ;16  PCM_1_16_11
  1381.  
  1382.      dd  4096,   5462, resample_2     ;17  PCM_2_16_8
  1383.      dd  2048,   5462, resample_1     ;18  PCM_1_16_8
  1384.  
  1385.      dd 16384,      0, s8_stereo      ;19  PCM_2_8_48
  1386.      dd  8192,      0, m8_stereo      ;20  PCM_1_8_48
  1387.  
  1388.      dd  8192,  30109, resample_28    ;21  PCM_2_8_44
  1389.      dd  4096,  30109, resample_18    ;22  PCM_1_8_44
  1390.  
  1391.      dd  8192,  21846, resample_28    ;23  PCM_2_8_32
  1392.      dd  4096,  21846, resample_18    ;24  PCM_1_8_32
  1393.  
  1394.      dd  8192,  16384, resample_28    ;25  PCM_2_8_24
  1395.      dd  4096,  16384, resample_18    ;26  PCM_1_8_24
  1396.  
  1397.      dd  4096,  15052, resample_28    ;27  PCM_2_8_22
  1398.      dd  2048,  15052, resample_18    ;28  PCM_1_8_22
  1399.  
  1400.      dd  4096,  10923, resample_28    ;29  PCM_2_8_16
  1401.      dd  2048,  10923, resample_18    ;30  PCM_1_8_16
  1402.  
  1403.      dd  4096,   8192, resample_28    ;31  PCM_2_8_12
  1404.      dd  2048,   8192, resample_18    ;32  PCM_1_8_12
  1405.  
  1406.      dd  2048,   7527, resample_28    ;33  PCM_2_8_11
  1407.      dd  1024,   7527, resample_18    ;34  PCM_1_8_11
  1408.  
  1409.      dd  2048,   5462, resample_28    ;35  PCM_2_8_8
  1410.      dd  1024,   5462, resample_18    ;36  PCM_1_8_8
  1411.  
  1412. m7            dw 0x8000,0x8000,0x8000,0x8000
  1413. mm80          dq 0x8080808080808080
  1414. mm_mask       dq 0xFF00FF00FF00FF00
  1415.  
  1416. vol_max       dd 0x00000000,0x00000000
  1417. vol_min       dd 0x0000D8F0,0x0000D8F0
  1418. pan_max       dd 0x00002710,0x00002710
  1419.  
  1420. ;stream_map    dd 0xFFFF       ; 16
  1421.  
  1422. szInfinity    db 'INFINITY',0
  1423. szSound       db 'SOUND',0
  1424.  
  1425. if DEBUG
  1426. msgFail       db 'Sound service not loaded',13,10,0
  1427. msgPlay       db 'Play buffer',13,10,0
  1428. msgStop       db 'Stop',13,10,0
  1429. msgUser       db 'User callback',13,10,0
  1430. msgMem        db 'Not enough memory',13,10,0
  1431. msgDestroy    db 'Destroy sound buffer', 13,10,0
  1432. msgWaveout    db 'Play waveout', 13,10,0
  1433. msgSetVolume  db 'Set volume',13,10,0
  1434. end if
  1435.  
  1436. align 4
  1437. data fixups
  1438. end data
  1439.  
  1440. section '.data' data readable writable
  1441.  
  1442. play_list     rd 16
  1443. mix_input     rd 16
  1444. play_count    rd 1
  1445. hSound        rd 1
  1446. eng_state     rd 1
  1447. mix_buff      rd 1
  1448. mix_buff_map  rd 1
  1449. str.fd        rd 1
  1450. str.bk        rd 1
  1451.  
  1452. mix_2_core    rd 1
  1453. mix_3_core    rd 1
  1454. mix_4_core    rd 1
  1455.