Sha256: c62037a8a405ab8e03deb71c3dcaf1f9e87641fac4f08798b07f80fa0b9e732a

Contents?: true

Size: 1.86 KB

Versions: 3

Compression:

Stored size: 1.86 KB

Contents

#include <stdio.h>
#include <stdint.h>
#include <seal/fmt.h>
#include <seal/err.h>
#include "reader.h"

enum
{
    RIFF = SEAL_MKTAG('R', 'I', 'F', 'F'),
    WAVE = SEAL_MKTAG('W', 'A', 'V', 'E'),
    OGGS = SEAL_MKTAG('O', 'g', 'g', 'S'),
    /* APE tag identifier (splitted). */
    APET = SEAL_MKTAG('A', 'P', 'E', 'T'),
    AGEX = SEAL_MKTAG('A', 'G', 'E', 'X'),
    /* Number of magic numbers needed to recognize the format. */
    SAMPLE_SIZE = 3
};

/* ID3v1 tag identifier. */
static const unsigned int TAG_ = SEAL_MKTAG('T', 'A', 'G', 0);
/* ID3v2 tag identifier. */
static const unsigned int ID3_ = SEAL_MKTAG('I', 'D', '3', 0);
/* MP3 Sync identifier. */
static const unsigned int SYNC = 0xf0ff;

seal_err_t
seal_recognize_fmt(const char* filename, seal_fmt_t* pfmt)
{
    FILE* audio;
    uint32_t magic_nums[SAMPLE_SIZE];

    audio = _seal_fopen(filename);
    if (audio == 0)
        return SEAL_CANNOT_OPEN_FILE;

    /* Gets the magic numbers in little-endian. */
    _seal_read_uint32le(magic_nums, SAMPLE_SIZE, audio);

    _seal_fclose(audio);

    switch (magic_nums[0]) {
    case RIFF:
        switch (magic_nums[2]) {
        case WAVE:
            *pfmt = SEAL_WAV_FMT;
            return SEAL_OK;
        }
        break;
    case OGGS:
        *pfmt = SEAL_OV_FMT;
        return SEAL_OK;
    case APET:
        switch (magic_nums[1]) {
        case AGEX:
            *pfmt = SEAL_MPG_FMT;
            return SEAL_OK;
        }
        break;
    }

    if ((magic_nums[0] & TAG_) == TAG_ ||
        (magic_nums[0] & ID3_) == ID3_ ||
        (magic_nums[0] & SYNC) == SYNC) {
        *pfmt = SEAL_MPG_FMT;
        return SEAL_OK;
    }

    *pfmt = SEAL_UNKNOWN_FMT;

    return SEAL_BAD_AUDIO;
}

seal_err_t
seal_ensure_fmt_known(const char* filename, seal_fmt_t* pfmt)
{
    if (*pfmt == SEAL_UNKNOWN_FMT)
        return seal_recognize_fmt(filename, pfmt);

    return SEAL_OK;
}

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
seal-0.1.3 src/seal/fmt.c
seal-0.1.2 src/seal/fmt.c
seal-0.1.1 src/seal/fmt.c