Commit 0d02712f authored by sagnowski's avatar sagnowski
Browse files

Add float interface to AudioFileReader

parent cff7dca2
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -535,7 +535,12 @@ int main(
#endif

#ifdef FLOAT_INTERFACE_ENC
    bool inputFileIsFloat = false; /* TODO(sgi):  */
    bool inputFileIsFloat;
    if ( ( error = AudioFileReader_isFileFloatingPoint( audioReader, &inputFileIsFloat ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) );
        goto cleanup;
    }

    if ( inputFileIsFloat )
    {
@@ -576,13 +581,15 @@ int main(
#ifdef FLOAT_INTERFACE_ENC
        if ( inputFileIsFloat )
        {
            fprintf( stderr, "\nReading of float wav files not implemented\n" );
            if ( ( error = AudioFileReader_readToFloat( audioReader, audioReadBufFloat, encDelayInSamples, &numSamplesRead ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) );
                goto cleanup;
            /* TODO(sgi): Add float reading to AudioFileReader */
            }
        }
        else
        {
            if ( ( error = AudioFileReader_read( audioReader, audioReadBufInt, encDelayInSamples, &numSamplesRead ) ) != IVAS_ERR_OK )
            if ( ( error = AudioFileReader_readToInt16( audioReader, audioReadBufInt, encDelayInSamples, &numSamplesRead ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) );
                goto cleanup;
@@ -638,13 +645,15 @@ int main(
#ifdef FLOAT_INTERFACE_ENC
        if ( inputFileIsFloat )
        {
            fprintf( stderr, "\nReading of float wav files not implemented\n" );
            if ( ( error = AudioFileReader_readToFloat( audioReader, audioReadBufFloat, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) );
                goto cleanup;
            /* TODO(sgi): Add float reading to AudioFileReader */
            }
        }
        else
        {
            if ( ( error = AudioFileReader_read( audioReader, audioReadBufInt, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK )
            if ( ( error = AudioFileReader_readToInt16( audioReader, audioReadBufInt, pcmBufSize, &numSamplesRead ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError reading from file %s\n%s\n", arg.inputWavFilename, IVAS_ENC_GetErrorMessage( error ) );
                goto cleanup;
+4 −0
Original line number Diff line number Diff line
@@ -842,7 +842,11 @@ int main(
        num_in_channels = inBuffer.config.numChannels;

        /* Read the input data */
#ifdef FLOAT_INTERFACE_ENC
        if ( ( error = AudioFileReader_readToInt16( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK )
#else
        if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK )
#endif
        {
            fprintf( stderr, "\nError reading from file %s\n", audioFilePath );
            exit( -1 );
+4 −0
Original line number Diff line number Diff line
@@ -117,6 +117,10 @@ typedef enum
    IVAS_ERR_FAILED_FILE_READ,
    IVAS_ERR_FAILED_FILE_PARSE,
    IVAS_ERR_END_OF_FILE,
#ifdef FLOAT_INTERFACE_ENC
    IVAS_ERR_NO_FILE_OPEN,
    IVAS_ERR_INVALID_AUDIO_FORMAT,
#endif
    IVAS_ERR_BITSTREAM_WRITER_INVALID_FORMAT,
    IVAS_ERR_BITSTREAM_READER_INVALID_DATA,
    IVAS_ERR_BITSTREAM_READER_INVALID_FORMAT,
+102 −0
Original line number Diff line number Diff line
@@ -149,7 +149,108 @@ void AudioFileReader_close(
    return;
}

#ifdef FLOAT_INTERFACE_ENC
/*! r: ivas_error */
ivas_error AudioFileReader_isFileFloatingPoint(
    AudioFileReader *self,    /* i/o: AudioFileReader handle                                                         */
    bool *isFileFloatingPoint /* o  : set to "true" if opened file contains floating-point values, "false" otherwise */
)
{
    if ( self == NULL || isFileFloatingPoint == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    if ( self->rawFile )
    {
        *isFileFloatingPoint = false;
    }
    else if ( self->wavFile )
    {
        /* tinywavein_c only supports 16-bit int, 24-bit int and 32-bit float */
        *isFileFloatingPoint = self->wavFile->bps == 32;
    }
    else
    {
        return IVAS_ERR_NO_FILE_OPEN;
    }

    return IVAS_ERR_OK;
}

/*! r: ivas_error */
ivas_error AudioFileReader_readToFloat(
    AudioFileReader *self,    /* i/o: AudioFileReader handle                                                 */
    float *samples,           /* o  : output audio buffer. Samples will be written in an interleaved layout. */
    const int16_t numSamples, /* i  : total number of samples to read                                        */
    int16_t *numSamplesRead   /* i  : total number of samples actually read                                  */
)
{
    uint32_t numSamplesRead32 = 0;

    if ( self == NULL || samples == NULL || numSamplesRead == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    if ( self->rawFile )
    {
        return IVAS_ERR_INVALID_AUDIO_FORMAT;
    }
    else if ( self->wavFile )
    {
        if ( ReadWavFloat( self->wavFile, samples, numSamples, &numSamplesRead32 ) != __TWI_SUCCESS )
        {
            return IVAS_ERR_FAILED_FILE_READ;
        }

        *numSamplesRead = (int16_t) numSamplesRead32;
    }
    else
    {
        return IVAS_ERR_NO_FILE_OPEN;
    }

    return IVAS_ERR_OK;
}

/*! r: ivas_error */
ivas_error AudioFileReader_readToInt16(
    AudioFileReader *self,    /* i/o: AudioFileReader handle                                                 */
    int16_t *samples,         /* o  : output audio buffer. Samples will be written in an interleaved layout. */
    const int16_t numSamples, /* i  : total number of samples to read                                        */
    int16_t *numSamplesRead   /* i  : total number of samples actually read                                  */
)
{
    uint32_t numSamplesRead32 = 0;

    if ( self == NULL || samples == NULL || numSamplesRead == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    if ( self->rawFile )
    {
        /* No errors possible here, numSamples != *numSamplesRead is a valid condition */
        *numSamplesRead = (int16_t) fread( samples, sizeof( int16_t ), numSamples, self->rawFile );
    }
    else if ( self->wavFile )
    {
        if ( ReadWavShort( self->wavFile, samples, numSamples, &numSamplesRead32 ) != __TWI_SUCCESS )
        {
            return IVAS_ERR_FAILED_FILE_READ;
        }

        *numSamplesRead = (int16_t) numSamplesRead32;
    }
    else
    {
        return IVAS_ERR_NO_FILE_OPEN;
    }

    return IVAS_ERR_OK;
}
#else
/*! r: number of read samples */
ivas_error AudioFileReader_read(
    AudioFileReader *self,    /* i/o: AudioFileReader handle                */
@@ -179,6 +280,7 @@ ivas_error AudioFileReader_read(

    return error;
}
#endif

/*! r: number of channels of the opened file */
int16_t AudioFileReader_getNumChannels(
+28 −0
Original line number Diff line number Diff line
@@ -36,6 +36,10 @@
#include <stdint.h>
#include "ivas_error.h"

#ifdef FLOAT_INTERFACE_ENC
#include <stdbool.h>
#endif

struct AudioFileReader;
typedef struct AudioFileReader AudioFileReader;

@@ -47,6 +51,29 @@ ivas_error AudioFileReader_open(
    int32_t *sampleRate                       /* o  : sample rate of wav file, unused with pcm  */
);

#ifdef FLOAT_INTERFACE_ENC
/*! r: ivas_error */
ivas_error AudioFileReader_isFileFloatingPoint(
    AudioFileReader *self,                    /* i/o: AudioFileReader handle                                                         */
    bool* isFileFloatingPoint                 /* o  : set to "true" if opened file contains floating-point values, "false" otherwise */
);

/*! r: ivas_error */
ivas_error AudioFileReader_readToFloat(
    AudioFileReader *self,                    /* i/o: AudioFileReader handle                                                 */
    float *samples,                           /* o  : output audio buffer. Samples will be written in an interleaved layout. */
    const int16_t numSamples,                 /* i  : total number of samples to read                                        */
    int16_t *numSamplesRead                   /* i  : total number of samples actually read                                  */
);

/*! r: ivas_error */
ivas_error AudioFileReader_readToInt16(
    AudioFileReader *self,                    /* i/o: AudioFileReader handle                                                 */
    int16_t *samples,                         /* o  : output audio buffer. Samples will be written in an interleaved layout. */
    const int16_t numSamples,                 /* i  : total number of samples to read                                        */
    int16_t *numSamplesRead                   /* i  : total number of samples actually read                                  */
);
#else
/*! r: number of read samples */
ivas_error AudioFileReader_read(
    AudioFileReader *self,                    /* i/o: AudioFileReader handle                */
@@ -54,6 +81,7 @@ ivas_error AudioFileReader_read(
    const int16_t numSamples,                 /* i  : total number of samples to read       */
    int16_t *numSamplesRead                   /* i  : total number of samples actualy read  */
);
#endif

/*! r: number of channels of the opened file */
int16_t AudioFileReader_getNumChannels(
Loading