void* operator new[] (size_t size) throw (bad_alloc) { if (m_poolManager.init != B_OK) throw bad_alloc(); void* ret = rtm_alloc(m_poolManager.pool, size); if (! ret) throw bad_alloc(); return ret; }
status_t rtm_realloc(void** _buffer, size_t newSize) { if (_buffer == NULL) return B_BAD_VALUE; TRACE("rtm_realloc(%p, %lu)\n", *_buffer, newSize); void* oldBuffer = *_buffer; // find pool rtm_pool* pool = pool_for(oldBuffer); if (pool == NULL) { void* buffer = realloc(oldBuffer, newSize); if (buffer != NULL) { *_buffer = buffer; return B_OK; } return B_NO_MEMORY; } MutexLocker _(&pool->lock); if (newSize == 0) { TRACE("realloc(%p, %lu) -> NULL\n", oldBuffer, newSize); pool->Free(oldBuffer); *_buffer = NULL; return B_OK; } size_t copySize = newSize; if (oldBuffer != NULL) { FreeChunk* oldChunk = FreeChunk::SetToAllocated(oldBuffer); // Check if the old buffer still fits, and if it makes sense to keep it if (oldChunk->Size() >= newSize && newSize > oldChunk->Size() / 3) { TRACE("realloc(%p, %lu) old buffer is large enough\n", oldBuffer, newSize); return B_OK; } if (copySize > oldChunk->Size()) copySize = oldChunk->Size(); } void* newBuffer = rtm_alloc(pool, newSize); if (newBuffer == NULL) return B_NO_MEMORY; if (oldBuffer != NULL) { memcpy(newBuffer, oldBuffer, copySize); pool->Free(oldBuffer); } TRACE("realloc(%p, %lu) -> %p\n", oldBuffer, newSize, newBuffer); *_buffer = newBuffer; return B_OK; }
void MixerCore::ApplyOutputFormat() { ASSERT_LOCKED(); media_multi_audio_format format = fOutput->MediaOutput().format.u.raw_audio; if (fMixBuffer != NULL) rtm_free(fMixBuffer); delete fMixBufferChannelTypes; fMixBufferFrameRate = (int32)(0.5 + format.frame_rate); fMixBufferFrameCount = frames_per_buffer(format); if (fDoubleRateMixing) { fMixBufferFrameRate *= 2; fMixBufferFrameCount *= 2; } fMixBufferChannelCount = format.channel_count; ASSERT(fMixBufferChannelCount == fOutput->GetOutputChannelCount()); fMixBufferChannelTypes = new int32 [format.channel_count]; for (int i = 0; i < fMixBufferChannelCount; i++) { fMixBufferChannelTypes[i] = ChannelMaskToChannelType(GetChannelMask(i, format.channel_mask)); } fMixBuffer = (float *)rtm_alloc(NULL, sizeof(float) * fMixBufferFrameCount * fMixBufferChannelCount); ASSERT(fMixBuffer); if (fResampler) { for (int i = 0; i < fMixBufferChannelCount; i++) delete fResampler[i]; delete [] fResampler; } fResampler = new Resampler * [fMixBufferChannelCount]; for (int i = 0; i < fMixBufferChannelCount; i++) { fResampler[i] = new Resampler(media_raw_audio_format::B_AUDIO_FLOAT, format.format); } TRACE("MixerCore::OutputFormatChanged:\n"); TRACE(" fMixBufferFrameRate %ld\n", fMixBufferFrameRate); TRACE(" fMixBufferFrameCount %ld\n", fMixBufferFrameCount); TRACE(" fMixBufferChannelCount %ld\n", fMixBufferChannelCount); for (int i = 0; i < fMixBufferChannelCount; i++) TRACE(" fMixBufferChannelTypes[%i] %ld\n", i, fMixBufferChannelTypes[i]); MixerInput *input; for (int i = 0; (input = Input(i)); i++) input->SetMixBufferFormat(fMixBufferFrameRate, fMixBufferFrameCount); }
void MixerInput::SetMixBufferFormat(int32 framerate, int32 frames) { TRACE("MixerInput::SetMixBufferFormat: framerate %ld, frames %ld\n", framerate, frames); fMixBufferFrameRate = framerate; fDebugMixBufferFrames = frames; // frames and/or framerate can be 0 (if no output is connected) if (framerate == 0 || frames == 0) { if (fMixBuffer != NULL) { rtm_free(fMixBuffer); fMixBuffer = NULL; } for (int i = 0; i < fInputChannelCount; i++) fInputChannelInfo[i].buffer_base = 0; fMixBufferFrameCount = 0; _UpdateInputChannelDestinationMask(); _UpdateInputChannelDestinations(); return; } // make fMixBufferFrameCount an integral multiple of frames, // but at least 3 times duration of our input buffer // and at least 2 times duration of the output buffer bigtime_t inputBufferLength = duration_for_frames( fInput.format.u.raw_audio.frame_rate, frames_per_buffer(fInput.format.u.raw_audio)); bigtime_t outputBufferLength = duration_for_frames(framerate, frames); bigtime_t mixerBufferLength = max_c(3 * inputBufferLength, 2 * outputBufferLength); int temp = frames_for_duration(framerate, mixerBufferLength); fMixBufferFrameCount = ((temp / frames) + 1) * frames; TRACE(" inputBufferLength %10Ld\n", inputBufferLength); TRACE(" outputBufferLength %10Ld\n", outputBufferLength); TRACE(" mixerBufferLength %10Ld\n", mixerBufferLength); TRACE(" fMixBufferFrameCount %10d\n", fMixBufferFrameCount); ASSERT((fMixBufferFrameCount % frames) == 0); fLastDataFrameWritten = -1; fFractionalFrames = 0.0; rtm_free(fMixBuffer); rtm_delete_pool(fRtmPool); int size = sizeof(float) * fInputChannelCount * fMixBufferFrameCount; if (rtm_create_pool(&fRtmPool, size) != B_OK) fRtmPool = NULL; fMixBuffer = (float*)rtm_alloc(fRtmPool, size); if (fMixBuffer == NULL) return; memset(fMixBuffer, 0, size); for (int i = 0; i < fInputChannelCount; i++) fInputChannelInfo[i].buffer_base = &fMixBuffer[i]; _UpdateInputChannelDestinationMask(); _UpdateInputChannelDestinations(); }