Commit d66368c9 authored by sagnowski's avatar sagnowski
Browse files

Prepare TD_RINGBUF for use in split rendering

parent f4d82119
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -1596,6 +1596,31 @@ void ivas_TD_RINGBUF_Close(
    TD_RINGBUF_HANDLE *ph                                       /* i/o: Ring buffer handle                      */
);

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
void ivas_TD_RINGBUF_PushInterleaved(
    TD_RINGBUF_HANDLE h,                                        /* i/o: Ring buffer handle                         */
    const float *data,                                          /* i  : Input audio in interleaved channels layout */
    const uint32_t num_samples_per_channel                      /* i  : Number of samples per channel to push      */
);

void ivas_TD_RINGBUF_PushChannels(
    TD_RINGBUF_HANDLE h,                                        /* i/o: Ring buffer handle                      */
    const float *p_channels[],                                  /* i  : Array of pointers to each input channel */
    const uint32_t num_samples_per_channel                      /* i  : Number of samples per channel to store  */
);

void ivas_TD_RINGBUF_PushConstant( 
    TD_RINGBUF_HANDLE h,                                        /* i/o: Ring buffer handle                      */
    const float value,                                          /* i  : Value to push                           */ 
    const uint32_t num_samples_per_channel                      /* i  : Number of samples per channel to push   */
);

void ivas_TD_RINGBUF_PopChannels( 
    TD_RINGBUF_HANDLE h,                                        /* i/o: Ring buffer handle                       */
    float *p_channels[],                                        /* i  : Array of pointers to each output channel */
    const uint32_t num_samples_per_channel                      /* i  : Number of samples per channel to pop     */
);
#else
void ivas_TD_RINGBUF_Push( 
    TD_RINGBUF_HANDLE h,                                        /* i/o: Ring buffer handle                       */
    const float *data,                                          /* i  : Input data                               */
@@ -1612,6 +1637,7 @@ void ivas_TD_RINGBUF_Pop(
    float *data,                                                /* i  : Output data                             */
    const uint32_t num_samples_per_channel                      /* i  : Number of samples per channel to retrieve*/
);
#endif

uint32_t ivas_TD_RINGBUF_Size(
    const TD_RINGBUF_HANDLE h                                   /* i  : Ring buffer handle                      */
+129 −0
Original line number Diff line number Diff line
@@ -66,6 +66,40 @@ static int16_t ivas_td_ringbuf_has_space_for_num_samples(
    return (int16_t) ( ivas_td_ringbuf_total_size( h ) + num_samples <= h->capacity );
}

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
static void ivas_td_ringbuf_push_interleaved(
    TD_RINGBUF_HANDLE h,                    /* i/o: Ring buffer handle                                              */
    const float *data,                      /* i  : Input audio in interleaved channels layout                      */
    const uint32_t num_samples_per_channel, /* i  : Number of samples per channel to push                           */
    const uint16_t read_stride              /* i: : 1 for normal operation, 0 for reading from a single input value */
)
{
    uint32_t s, read_s;

    assert( h != NULL );
    assert( data != NULL );
    assert( read_stride == 0 || read_stride == 1 );
    assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) );

    for ( s = 0, read_s = 0; s < num_samples_per_channel * h->num_channels; ++s, read_s += read_stride )
    {
        h->data[h->write_pos] = data[read_s];
        ++h->write_pos;

        if ( h->write_pos == h->capacity )
        {
            h->write_pos = 0;
        }
    }

    if ( h->read_pos == h->write_pos )
    {
        h->is_full = 1;
    }

    return;
}
#endif

/*-----------------------------------------------------------------------*
 * Global function definitions
@@ -150,6 +184,36 @@ void ivas_TD_RINGBUF_Close(
}


#ifdef FIX_1119_SPLIT_RENDERING_VOIP
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_PushInterleaved()
 *
 * Push samples from a buffer with interleaved channel layout onto the back of the TD ring buffer.
 *---------------------------------------------------------------------*/

void ivas_TD_RINGBUF_PushInterleaved(
    TD_RINGBUF_HANDLE h,                   /* i/o: Ring buffer handle                                              */
    const float *data,                     /* i  : Input audio in interleaved channels layout                      */
    const uint32_t num_samples_per_channel /* i  : Number of samples per channel to push                           */
)
{
    ivas_td_ringbuf_push_interleaved( h, data, num_samples_per_channel, 1 );

    return;
}

/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_PushChannels()
 *
 * Push samples from channel pointers onto the back of the TD ring buffer.
 *---------------------------------------------------------------------*/

void ivas_TD_RINGBUF_PushChannels(
    TD_RINGBUF_HANDLE h,                   /* i/o: Ring buffer handle                       */
    const float *p_channels[],             /* i  : Array of pointers to each input channel  */
    const uint32_t num_samples_per_channel /* i  : Number of samples per channel to push    */
)
#else
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_Push()
 *
@@ -162,17 +226,30 @@ void ivas_TD_RINGBUF_Push(
    const float *data,                     /* i  : Input data                               */
    const uint32_t num_samples_per_channel /* i  : Number of samples per channel to store   */
)
#endif
{
    uint32_t s;
    uint16_t c;

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    assert( h != NULL );
    assert( p_channels != NULL );
    for ( c = 0; c < h->num_channels; ++c )
    {
        assert( p_channels[c] != NULL );
    }
#endif
    assert( ivas_td_ringbuf_has_space_for_num_samples( h, num_samples_per_channel * h->num_channels ) );

    for ( s = 0; s < num_samples_per_channel; ++s )
    {
        for ( c = 0; c < h->num_channels; ++c )
        {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            h->data[h->write_pos] = p_channels[c][s];
#else
            h->data[h->write_pos] = *( data + c * num_samples_per_channel + s );
#endif
            ++h->write_pos;

            if ( h->write_pos == h->capacity )
@@ -191,6 +268,24 @@ void ivas_TD_RINGBUF_Push(
}


#ifdef FIX_1119_SPLIT_RENDERING_VOIP
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_PushConstant()
 *
 * Push samples with a constant value onto the back of the TD ring buffer.
 *---------------------------------------------------------------------*/

void ivas_TD_RINGBUF_PushConstant( 
    TD_RINGBUF_HANDLE h,                    /* i/o: Ring buffer handle                      */
    const float value,                      /* i  : Value to push                           */ 
    const uint32_t num_samples_per_channel  /* i  : Number of samples per channel to push   */
)
{
    ivas_td_ringbuf_push_interleaved( h, &value, num_samples_per_channel, 0 );

    return;
}
#else
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_PushZeros()
 *
@@ -232,8 +327,22 @@ void ivas_TD_RINGBUF_PushZeros(

    return;
}
#endif


#ifdef FIX_1119_SPLIT_RENDERING_VOIP
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_PopChannels()
 *
 * Pop samples from the front of the TD ring buffer to an array of channel pointers.
 *---------------------------------------------------------------------*/

void ivas_TD_RINGBUF_PopChannels(
    TD_RINGBUF_HANDLE h,                   /* i/o: Ring buffer handle                       */
    float *p_channels[],                   /* i  : Array of pointers to each output channel */
    const uint32_t num_samples_per_channel /* i  : Number of samples per channel to pop     */
)
#else
/*---------------------------------------------------------------------*
 * ivas_TD_RINGBUF_Pop()
 *
@@ -245,17 +354,30 @@ void ivas_TD_RINGBUF_Pop(
    float *data,                           /* i  : Output data                                  */
    const uint32_t num_samples_per_channel /* i  : Number of samples per channel to retrieve    */
)
#endif
{
    uint32_t s;
    uint16_t c;

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    assert( h != NULL );
    assert( p_channels != NULL );
    for ( c = 0; c < h->num_channels; ++c )
    {
        assert( p_channels[c] != NULL );
    }
#endif
    assert( ivas_td_ringbuf_total_size( h ) >= num_samples_per_channel * h->num_channels );

    for ( s = 0; s < num_samples_per_channel; ++s )
    {
        for ( c = 0; c < h->num_channels; ++c )
        {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            p_channels[c][s] = h->data[h->read_pos];
#else
            *( data + c * num_samples_per_channel + s ) = h->data[h->read_pos];
#endif
            ++h->read_pos;

            if ( h->read_pos == h->capacity )
@@ -265,10 +387,17 @@ void ivas_TD_RINGBUF_Pop(
        }
    }

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    if ( num_samples_per_channel != 0 )
    {
        h->is_full = 0;
    }
#else
    if ( h->is_full )
    {
        h->is_full = 0;
    }
#endif

    return;
}
+23 −0
Original line number Diff line number Diff line
@@ -1479,6 +1479,11 @@ static ivas_error alignInputDelay(
    int16_t maxGlobalDelaySamples;
    int32_t numSamplesToPush, numSamplesToPop;
    uint32_t ringBufferSize, preDelay;
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    int32_t i;
    const float *p_read_channels[MAX_INPUT_CHANNELS];
    float *p_write_channels[MAX_INPUT_CHANNELS];
#endif

    maxGlobalDelaySamples = latencyNsToSamples( sampleRateOut, maxGlobalDelayNs );
    maxGlobalDelaySamples *= cldfb2tdSampleFact;
@@ -1501,7 +1506,11 @@ static ivas_error alignInputDelay(

            /* for the first frame we need to push zeros to align the input delay to the global delay
             * and then push a frame of actual data */
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
            ivas_TD_RINGBUF_PushConstant( inputBase->delayBuffer, 0, preDelay );
#else
            ivas_TD_RINGBUF_PushZeros( inputBase->delayBuffer, preDelay );
#endif

            /* for ISM inputs, ensure the metadata sync delay is updated */
            if ( getAudioConfigType( inputBase->inConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED )
@@ -1519,8 +1528,22 @@ static ivas_error alignInputDelay(
        numSamplesToPush = flushInputs ? 0 : inputAudio.config.numSamplesPerChannel;
        numSamplesToPop = flushInputs ? ivas_TD_RINGBUF_Size( inputBase->delayBuffer ) : (uint32_t) inputAudio.config.numSamplesPerChannel;

#ifdef FIX_1119_SPLIT_RENDERING_VOIP
        for ( i = 0; i < inputAudio.config.numChannels; ++i )
        {
            p_read_channels[i] = inputAudio.data + i * numSamplesToPush;
        }
        ivas_TD_RINGBUF_PushChannels( inputBase->delayBuffer, p_read_channels, numSamplesToPush );

        for ( i = 0; i < inputAudio.config.numChannels; ++i )
        {
            p_write_channels[i] = inputBase->inputBuffer.data + i * numSamplesToPop;
        }
        ivas_TD_RINGBUF_PopChannels( inputBase->delayBuffer, p_write_channels, numSamplesToPop );
#else
        ivas_TD_RINGBUF_Push( inputBase->delayBuffer, inputAudio.data, numSamplesToPush );
        ivas_TD_RINGBUF_Pop( inputBase->delayBuffer, inputBase->inputBuffer.data, numSamplesToPop );
#endif
    }
    else
    {