// File: fgheng[P]keysound/src/Audio.cc
// Function: Audio::read_wav(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, WAV_DATA&)
bool Audio::read_wav(const std::string &file, WAV_DATA& wav_data) {
    wav_data.data = nullptr;
    wav_data.len = 0;
    wav_data.bits_per_sample = 0;

    if (!file_exists(file)) return false;

    WAVE_HEADER header;
    std::ifstream f(file);
    if (f.is_open()) {
        f.read((char *)&header, sizeof(WAVE_HEADER));

        // 不是wav文件		Not a wav file
        if (!tag_is_right(header.riff_id, header.riff_type)) goto failed;

        if (header.fmt_audio_format == 1) {
            if (!init_property) {
                channels = header.fmt_channels;
                sample_rate = header.fmt_sample_rate;
                bits_per_sample = header.fmt_bits_per_sample;
                init_property = true;
            } else if (header.fmt_channels != channels
                    || header.fmt_sample_rate != sample_rate
                    || header.fmt_bits_per_sample != bits_per_sample) {
                goto failed;
            }
        } else {
            std::cout << file << " has not pcm tag" << std::endl;
            goto failed;
        }

        wav_data.len = header.data_size;
        wav_data.bits_per_sample =  header.fmt_bits_per_sample;
        wav_data.data = new uint8_t[wav_data.len];

        f.read((char *)wav_data.data, wav_data.len);

        // 更新最大值		Update the maximum size
        if (wav_data.len > max_len) max_len = wav_data.len;

        f.close();
        return true;
    } // else goto failed;

failed:
    f.close();
    return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x2a0, %rsp            # imm = 0x2A0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x270(%rbp)
movq -0x20(%rbp), %rax
movq $0x0, (%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x8(%rax)
movq -0x20(%rbp), %rax
movw $0x0, 0xc(%rax)
movq -0x18(%rbp), %rsi
callq 0x95f0
testb $0x1, %al
jne 0x85b8
movb $0x0, -0x1(%rbp)
jmp 0x8807
movq -0x18(%rbp), %rsi
leaq -0x258(%rbp), %rdi
movq %rdi, -0x280(%rbp)
movl $0x8, %edx
callq 0x45e0
movq -0x280(%rbp), %rdi
callq 0x45d0
movb %al, -0x271(%rbp)
jmp 0x85e8
movb -0x271(%rbp), %al
testb $0x1, %al
jne 0x85f7
jmp 0x87dd
leaq -0x258(%rbp), %rdi
leaq -0x4c(%rbp), %rsi
movl $0x2c, %edx
callq 0x44c0
jmp 0x860e
movq -0x270(%rbp), %rdi
leaq -0x44(%rbp), %rdx
leaq -0x4c(%rbp), %rsi
callq 0x8830
movb %al, -0x281(%rbp)
jmp 0x862a
movb -0x281(%rbp), %al
testb $0x1, %al
jne 0x865e
jmp 0x8636
jmp 0x87df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x260(%rbp)
movl %eax, -0x264(%rbp)
leaq -0x258(%rbp), %rdi
callq 0x40f0
jmp 0x8815
movzwl -0x38(%rbp), %eax
cmpl $0x1, %eax
jne 0x86f1
movq -0x270(%rbp), %rax
testb $0x1, 0x1200(%rax)
jne 0x86aa
movq -0x270(%rbp), %rax
movw -0x36(%rbp), %cx
movw %cx, 0x1208(%rax)
movl -0x34(%rbp), %ecx
movl %ecx, 0x120c(%rax)
movw -0x2a(%rbp), %cx
movw %cx, 0x1210(%rax)
movb $0x1, 0x1200(%rax)
jmp 0x86ef
movq -0x270(%rbp), %rcx
movzwl -0x36(%rbp), %eax
movzwl 0x1208(%rcx), %ecx
cmpl %ecx, %eax
jne 0x86e8
movq -0x270(%rbp), %rcx
movl -0x34(%rbp), %eax
cmpl 0x120c(%rcx), %eax
jne 0x86e8
movq -0x270(%rbp), %rcx
movzwl -0x2a(%rbp), %eax
movzwl 0x1210(%rcx), %ecx
cmpl %ecx, %eax
je 0x86ed
jmp 0x87df
jmp 0x86ef
jmp 0x8740
movq -0x18(%rbp), %rsi
movq 0x168bc(%rip), %rdi     # 0x1efb8
callq 0x4310
movq %rax, -0x290(%rbp)
jmp 0x870a
movq -0x290(%rbp), %rdi
leaq 0xdeaa(%rip), %rsi      # 0x165c2
callq 0x43a0
movq %rax, -0x298(%rbp)
jmp 0x8726
movq -0x298(%rbp), %rdi
movq 0x16854(%rip), %rsi     # 0x1ef88
callq 0x4400
jmp 0x873b
jmp 0x87df
movl -0x24(%rbp), %ecx
movq -0x20(%rbp), %rax
movl %ecx, 0x8(%rax)
movw -0x2a(%rbp), %cx
movq -0x20(%rbp), %rax
movw %cx, 0xc(%rax)
movq -0x20(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, %edi
callq 0x4030
movq %rax, -0x2a0(%rbp)
jmp 0x876d
movq -0x2a0(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rsi
movl 0x8(%rax), %eax
movl %eax, %edx
leaq -0x258(%rbp), %rdi
callq 0x44c0
jmp 0x8795
movq -0x270(%rbp), %rcx
movq -0x20(%rbp), %rax
movl 0x8(%rax), %eax
cmpl 0x1204(%rcx), %eax
jbe 0x87bf
movq -0x270(%rbp), %rax
movq -0x20(%rbp), %rcx
movl 0x8(%rcx), %ecx
movl %ecx, 0x1204(%rax)
leaq -0x258(%rbp), %rdi
callq 0x40b0
jmp 0x87cd
movb $0x1, -0x1(%rbp)
movl $0x1, -0x268(%rbp)
jmp 0x87fb
jmp 0x87df
leaq -0x258(%rbp), %rdi
callq 0x40b0
jmp 0x87ed
movb $0x0, -0x1(%rbp)
movl $0x1, -0x268(%rbp)
leaq -0x258(%rbp), %rdi
callq 0x40f0
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x2a0, %rsp            # imm = 0x2A0
popq %rbp
retq
movq -0x260(%rbp), %rdi
callq 0x4670
nopw %cs:(%rax,%rax)