/* * Process tail of input samples. */ int st_resample_drain(eff_t effp, st_sample_t *obuf, st_size_t *osamp) { resample_t r = (resample_t) effp->priv; long isamp_res, osamp_res; st_sample_t *Obuf; int rc; /* fprintf(stderr,"Xoff %d, Xt %d <--- DRAIN\n",r->Xoff, r->Xt); */ /* stuff end with Xoff zeros */ isamp_res = r->Xoff; osamp_res = *osamp; Obuf = obuf; while (isamp_res>0 && osamp_res>0) { st_sample_t Isamp, Osamp; Isamp = isamp_res; Osamp = osamp_res; rc = st_resample_flow(effp, NULL, Obuf, (st_size_t *)&Isamp, (st_size_t *)&Osamp); if (rc) return rc; /* fprintf(stderr,"DRAIN isamp,osamp (%d,%d) -> (%d,%d)\n", isamp_res,osamp_res,Isamp,Osamp); */ Obuf += Osamp; osamp_res -= Osamp; isamp_res -= Isamp; } *osamp -= osamp_res; /* fprintf(stderr,"DRAIN osamp %d\n", *osamp); */ if (isamp_res) st_warn("drain overran obuf by %d\n", isamp_res); fflush(stderr); return (ST_SUCCESS); }
void CAudioEncoder::ResampleAudio( const u_int8_t* frameData, u_int32_t frameDataLength) { uint32_t samplesIn; uint32_t samplesInConsumed; uint32_t outBufferSamplesLeft; uint32_t outBufferSamplesWritten; uint32_t chan_offset; samplesIn = DstBytesToSamples(frameDataLength); // so far, record the pre length while (samplesIn > 0) { outBufferSamplesLeft = DstBytesToSamples(m_audioPreEncodingBufferMaxLength - m_audioPreEncodingBufferLength); if (outBufferSamplesLeft * 2 <= samplesIn && samplesIn > 0) { m_audioPreEncodingBufferMaxLength *= 2; m_audioPreEncodingBuffer = (u_int8_t*)realloc(m_audioPreEncodingBuffer, m_audioPreEncodingBufferMaxLength); } for (uint8_t chan_ix = 0; chan_ix < m_audioDstChannels; chan_ix++) { samplesInConsumed = samplesIn; outBufferSamplesWritten = outBufferSamplesLeft; chan_offset = chan_ix * (DstSamplesToBytes(1)); #ifdef DEBUG_AUDIO_RESAMPLER error_message("%s:resample - chans %d %d, samples %d left %d", Profile()->GetName(), m_audioDstChannels, chan_ix, samplesIn, outBufferSamplesLeft); #endif if (st_resample_flow(m_audioResample[chan_ix], (int16_t *)(frameData + chan_offset), (int16_t *)(&m_audioPreEncodingBuffer[m_audioPreEncodingBufferLength + chan_offset]), &samplesInConsumed, &outBufferSamplesWritten, m_audioDstChannels) < 0) { error_message("%s:resample failed", Profile()->GetName()); } #ifdef DEBUG_AUDIO_RESAMPLER debug_message("%s:Chan %d consumed %d wrote %d", Profile()->GetName(), chan_ix, samplesInConsumed, outBufferSamplesWritten); #endif } if (outBufferSamplesLeft < outBufferSamplesWritten) { error_message("%s:Written past end of buffer", Profile()->GetName()); } samplesIn -= samplesInConsumed; outBufferSamplesLeft -= outBufferSamplesWritten; m_audioPreEncodingBufferLength += DstSamplesToBytes(outBufferSamplesWritten); // If we have no room for new output data, and more to process, // give us a bunch more room... } // end while we still have input samples }