sea-codec 0.7.0

Low-complexity, lossy audio codec designed for embedded devices
Documentation
#include "sea.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#define WAV_HEADER_SIZE 44


void write_wav_header(FILE* file, uint32_t sample_rate, uint32_t channels, uint32_t num_frames)
{
    uint32_t byte_rate = sample_rate * channels * 2;
    uint32_t data_size = num_frames * channels * 2;
    uint32_t chunk_size = 36 + data_size;

    fwrite("RIFF", 1, 4, file);
    fwrite(&chunk_size, 4, 1, file);
    fwrite("WAVE", 1, 4, file);
    fwrite("fmt ", 1, 4, file);

    uint32_t subchunk1_size = 16;
    uint16_t audio_format = 1;
    uint16_t num_channels = (uint16_t)channels;
    uint32_t sample_rate_le = sample_rate;
    uint16_t bits_per_sample = 16;
    uint16_t block_align = num_channels * 2;
    uint32_t byte_rate_le = byte_rate;

    fwrite(&subchunk1_size, 4, 1, file);
    fwrite(&audio_format, 2, 1, file);
    fwrite(&num_channels, 2, 1, file);
    fwrite(&sample_rate_le, 4, 1, file);
    fwrite(&byte_rate_le, 4, 1, file);
    fwrite(&block_align, 2, 1, file);
    fwrite(&bits_per_sample, 2, 1, file);

    fwrite("data", 1, 4, file);
    fwrite(&data_size, 4, 1, file);
}

int main(int argc, char* argv[])
{
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <input_file> <output_file>\n", argv[0]);
        return 1;
    }

    FILE* input_file = fopen(argv[1], "rb");
    if (!input_file) {
        perror("Error opening input file");
        return 1;
    }

    fseek(input_file, 0, SEEK_END);
    uint32_t encoded_len = ftell(input_file);
    rewind(input_file);

    uint8_t* encoded = (uint8_t*)malloc(encoded_len);
    fread(encoded, 1, encoded_len, input_file);
    fclose(input_file);

    uint32_t sample_rate, channels, output_frames;
    sea_decode(encoded, encoded_len, &sample_rate, &channels, NULL, &output_frames);

    int16_t* output = (int16_t*)malloc(output_frames * channels * sizeof(int16_t));
    sea_decode(encoded, encoded_len, &sample_rate, &channels, output, &output_frames);
    free(encoded);

    FILE* output_file = fopen(argv[2], "wb");
    if (!output_file) {
        perror("Error opening output file");
        return 1;
    }

    write_wav_header(output_file, sample_rate, channels, output_frames);
    fwrite(output, sizeof(int16_t), output_frames * channels, output_file);
    fclose(output_file);

    free(output);
    printf("Decoding complete. Output written to %s\n", argv[2]);
    return 0;
}