#include "<SampleEd$Dir>.h.Driver"
#include <string.h>

/* Import Armadeus file */

osbool driver_import(char *filename,int filetype,int size)
    {
    char rate;           /* Sample rate from file        */

    int counter,         /* Index through file           */
        new_rate,        /* Calculated sample rate       */
        out_index,       /* Output buffer index          */
        pc,              /* Percentage complete          */
        lastpc = 0;      /* Previous percentage complete */

    short out[8192];

    double sample_time;

    char byte;

    FILE *fh;

    char buffer[BUFSIZ];

    NOT_USED(filetype);

/* Open file for reading */

    if ((fh = fopen(filename,"r")) == NULL)
        {
        driver_report_error("DrvErrOpen");
        return TRUE;
        }

    setbuf(fh,buffer);

/* Read sample rate */

    if (fread(&rate,1,1,fh) != 1)
        {
        fclose(fh);
        driver_report_error("DrvErrRead");
        return TRUE;
        }

/* Calculate sample rate as we need it */

    new_rate = 1000000 / rate;

/* Calculate duration of sample */

    sample_time = (size - 1) * 100.0 / new_rate;

/* Account for rounding */

    if (sample_time != (double)((int)(sample_time)))
        {
        sample_time += 1;
        }

/* Set initial sample details */

    driver_set_sample_details(new_rate,
                              (int)sample_time,
                              1,
                              16);

/* Set initial percentage */

    driver_percentage(0);

/* Loop round file */

    counter = 0;

    while (counter < size - 1)
        {
/* Calculate percentage complete */

        pc = 100 * counter / size;

/* Set new percentage if changed */

        if (pc > lastpc)
            {
            driver_percentage(pc);
            lastpc = pc;
            }

        out_index = 0;

        while ((counter + out_index) < size - 1 &&
               out_index < 4096)
            {
/* Read byte from file */

            if (fread(&byte,1,1,fh) != 1)
                {
                driver_report_error("DrvErrRead");
                fclose(fh);
                return TRUE;
                }

            out[out_index] = byte << 8;

            out_index++;
            }

/* Set byte in sample */

        if (driver_set_sample_block(counter,out,out_index))
            {
            fclose(fh);
            return TRUE;
            }

        counter += out_index;
        }

    fclose(fh);

    while (counter < driver_get_max_data_offset())
        {
        driver_set_sample(counter,0,0);
        counter++;
        }

    return FALSE;
    }


/* Return list of accepted file types */

DriverFileType *driver_filetypes(void)
    {
    static DriverFileType filetypes[2];

    filetypes[0].id = 0;
    filetypes[0].filetype = 0xd3c;
    filetypes[0].suffix[0] = '\0';
    strcpy(filetypes[0].description,"Armadeus");

    filetypes[0].id = 1;
    filetypes[1].filetype = 0;
    filetypes[1].suffix[0] = '\0';
    filetypes[1].description[0] = '\0';

    return filetypes;
    }


/* Return list of sub file types */

DriverSubFileType *driver_subfiletypes(int id)
    {
    static DriverSubFileType filetypes[2];

    NOT_USED(id);

    filetypes[0].id = 1;
    strcpy(filetypes[0].description,"8 bit");

    filetypes[1].id = 0;
    filetypes[1].description[0] = '\0';

    return filetypes;
    }
