toWav:0040BB4C ; =============== S U B R O U T I N E ======================================= toWav:0040BB4C toWav:0040BB4C ; Attributes: bp-based frame toWav:0040BB4C toWav:0040BB4C xma_setup proc near ; CODE XREF: xma_decode_single_stream+59p toWav:0040BB4C ; sub_40C000+34p toWav:0040BB4C toWav:0040BB4C zero? = dword ptr -10h toWav:0040BB4C rc = byte ptr -9 toWav:0040BB4C channel_count = dword ptr -8 toWav:0040BB4C byterate = dword ptr -4 toWav:0040BB4C some_boolp = dword ptr 8 toWav:0040BB4C audio_info_ptr = dword ptr 0Ch toWav:0040BB4C WAVE_fmt_ptr = dword ptr 10h toWav:0040BB4C decode_flags = word ptr 14h toWav:0040BB4C toWav:0040BB4C push ebp toWav:0040BB4D mov ebp, esp toWav:0040BB4F add esp, 0FFFFFFF0h toWav:0040BB52 push ebx toWav:0040BB53 push esi toWav:0040BB54 push edi toWav:0040BB55 mov [ebp+channel_count], ecx toWav:0040BB58 mov edi, edx ; sample rate toWav:0040BB5A mov [ebp+byterate], eax toWav:0040BB5D mov esi, [ebp+audio_info_ptr] toWav:0040BB60 mov ebx, [ebp+WAVE_fmt_ptr] toWav:0040BB63 mov [ebp+rc], 0 toWav:0040BB67 cmp [ebp+channel_count], 1 toWav:0040BB6B jz short loc_40BB77 toWav:0040BB6D cmp [ebp+channel_count], 2 toWav:0040BB71 jnz done ; has to be mono or stereo toWav:0040BB77 toWav:0040BB77 loc_40BB77: ; CODE XREF: xma_setup+1Fj toWav:0040BB77 mov ax, [ebp+decode_flags] toWav:0040BB7B and ax, 8000h toWav:0040BB7F movzx eax, ax toWav:0040BB82 mov edx, [ebp+some_boolp] toWav:0040BB85 mov [edx], eax toWav:0040BB87 and [ebp+decode_flags], 7FFFh toWav:0040BB8D cmp edi, 24000 ; inlined GetXmaSampleRate toWav:0040BB93 jg short loc_40BB9C toWav:0040BB95 mov edi, 24000 toWav:0040BB9A jmp short dunadjustin toWav:0040BB9C ; --------------------------------------------------------------------------- toWav:0040BB9C toWav:0040BB9C loc_40BB9C: ; CODE XREF: xma_setup+47j toWav:0040BB9C cmp edi, 32000 toWav:0040BBA2 jg short loc_40BBAB toWav:0040BBA4 mov edi, 32000 toWav:0040BBA9 jmp short dunadjustin toWav:0040BBAB ; --------------------------------------------------------------------------- toWav:0040BBAB toWav:0040BBAB loc_40BBAB: ; CODE XREF: xma_setup+56j toWav:0040BBAB cmp edi, 44100 toWav:0040BBB1 jg short loc_40BBBA toWav:0040BBB3 mov edi, 44100 toWav:0040BBB8 jmp short dunadjustin toWav:0040BBBA ; --------------------------------------------------------------------------- toWav:0040BBBA toWav:0040BBBA loc_40BBBA: ; CODE XREF: xma_setup+65j toWav:0040BBBA mov edi, 48000 toWav:0040BBBF toWav:0040BBBF dunadjustin: ; CODE XREF: xma_setup+4Ej toWav:0040BBBF ; xma_setup+5Dj ... toWav:0040BBBF cmp [ebp+decode_flags], 0 toWav:0040BBC4 jnz short loc_40BBCC toWav:0040BBC6 mov [ebp+decode_flags], 10D6h ; XMA decode flags? toWav:0040BBCC toWav:0040BBCC loc_40BBCC: ; CODE XREF: xma_setup+78j toWav:0040BBCC xor eax, eax toWav:0040BBCE mov [ebp+zero?], eax toWav:0040BBD1 movzx eax, [ebp+decode_flags] toWav:0040BBD5 push eax toWav:0040BBD6 push 3 toWav:0040BBD8 mov eax, [ebp+channel_count] toWav:0040BBDB push eax toWav:0040BBDC mov eax, [ebp+byterate] toWav:0040BBDF shl eax, 3 ; convert to bit count? toWav:0040BBE2 push eax toWav:0040BBE3 push edi toWav:0040BBE4 call wma_samples_per_frame toWav:0040BBE9 cmp eax, 200h toWav:0040BBEE jnz short done toWav:0040BBF0 mov [ebx+RIFF_WAVE_fmt_wmapro.codec], 162h ; looks like we're building a fmt chunk (wma pro id) toWav:0040BBF5 mov ax, word ptr [ebp+channel_count] toWav:0040BBF9 mov [ebx+RIFF_WAVE_fmt_wmapro.channels], ax toWav:0040BBFD mov [ebx+RIFF_WAVE_fmt_wmapro.sample_rate], edi toWav:0040BC00 mov eax, [ebp+byterate] toWav:0040BC03 mov [ebx+RIFF_WAVE_fmt_wmapro.byterate], eax toWav:0040BC06 mov [ebx+RIFF_WAVE_fmt_wmapro.block_align], 800h ; packet per block? toWav:0040BC0C mov [ebx+RIFF_WAVE_fmt_wmapro.bits_per_sample], 10h toWav:0040BC12 mov eax, [ebp+zero?] toWav:0040BC15 mov [ebx+RIFF_WAVE_fmt_wmapro.zeroed], eax ; extra fmt info count (0?) toWav:0040BC18 mov ax, [ebp+decode_flags] toWav:0040BC1C mov [ebx+RIFF_WAVE_fmt_wmapro.decode_flags], ax ; wmapro extra info is decode flags toWav:0040BC20 mov [esi+audio_info_s.sample_rate], edi toWav:0040BC22 mov eax, [ebp+channel_count] toWav:0040BC25 mov [esi+audio_info_s.channel_count], eax toWav:0040BC28 mov eax, [ebp+zero?] toWav:0040BC2B mov [esi+audio_info_s.zeroed], eax toWav:0040BC2E mov [esi+audio_info_s.bits_per_sample], 10h toWav:0040BC35 mov [esi+audio_info_s.bytes_per_sample?], 2 toWav:0040BC3C xor eax, eax toWav:0040BC3E mov [esi+audio_info_s.zeroed2], eax toWav:0040BC41 mov [ebp+rc], 1 ; success toWav:0040BC45 toWav:0040BC45 done: ; CODE XREF: xma_setup+25j toWav:0040BC45 ; xma_setup+A2j toWav:0040BC45 mov al, [ebp+rc] toWav:0040BC48 pop edi toWav:0040BC49 pop esi toWav:0040BC4A pop ebx toWav:0040BC4B mov esp, ebp toWav:0040BC4D pop ebp toWav:0040BC4E retn 10h toWav:0040BC4E xma_setup endp