# mp32wav — Decodificador MP3 Paralelo Multi-Thread (NUMA-Aware) Conversor de MP3 para WAV utilizando **libmad** com decodificação paralela multi-thread, herdando a arquitetura de hiperescala do **Gzip3** (compartimentos, SMT-aware, NUMA-aware, thermal capping). ## Arquitetura ### Pipeline 1. **Escaneamento de frames**: Varre o arquivo MP3, localiza todos os sync words (`0xFFF`) e calcula tamanho/posição de cada frame via tabela de bitrate 2. **Divisão em ranges contíguos**: Cada thread recebe um bloco sequencial de frames (respeita o *bit reservoir* do Layer 3) 3. **Decodificação paralela**: Cada thread cria seu próprio `mad_stream` + `mad_frame` + `mad_synth` — zero compartilhamento de estado 4. **Reordenação implícita**: Threads escrevem direto no slot global `pcm_output[frame_id]` — sem locks, sem reordenação extra 5. **Escrita WAV**: Cabeçalho PCM 16-bit + dados contíguos ### Herança do Gzip3 - **NUMA-aware**: Alocação de memória nos nós corretos - **SMT-aware**: Núcleos físicos primeiro, virtuais depois - **Thermal capping**: Threads ociosas finalizam cedo (previsto) - **Controladores de barramento**: Semáforos de vazão de RAM (64 controladores) ## Compilação ```bash cd mp32wav make ``` Pré-requisitos: `libmad0-dev`, `libnuma-dev` ```bash sudo apt install libmad0-dev libnuma-dev ``` ## Uso ```bash ./mp32wav <entrada.mp3> <saida.wav> <threads> ``` Exemplo: ```bash ./mp32wav musica.mp3 musica.wav 8 ``` ## Performance A aceleração depende do número de frames MP3 e da quantidade de threads. Para arquivos longos (muitos frames), a escalabilidade é linear até o limite de núcleos físicos disponíveis. ## Estrutura dos Arquivos | Arquivo | Descrição | |---------|-----------| | `mp32wav.c` | Main, scan de frames, distribuição de tarefas, escrita WAV | | `decode.c` | Worker thread com mad_frame_decode + mad_synth | | `mp32wav.h` | Structs, defines, declarações | ## Licença GPLv3 (mesma do Gzip3).