//***************************************************************************** // //! reads the content of one buffer into the other. //! //! \param pCircularBuffer is the pointer to the control structure for circular //! buffer. //! \param pucBuffer is the pointer to the buffer to which the content is //! copied. //! \param uiPacketSize is the amount of data need to be copied from Circular //! Buffer to the pucBuffer. //! //! This function //! 1. Copies the uiPacketSize of data from pCircularBuffer to the //! pucBuffer. //! //! \return amount of data copied. // //***************************************************************************** long ReadBuffer(tCircularBuffer *pCircularBuffer, unsigned char *pucBuffer, unsigned int uiDataSize) { int uiOffset; uiOffset=((pCircularBuffer->pucReadPtr+uiDataSize) - pCircularBuffer->pucBufferEndPtr); if(uiOffset <= 0) { memcpy(pucBuffer, pCircularBuffer->pucReadPtr, uiDataSize); } else { memcpy(pucBuffer, pCircularBuffer->pucReadPtr, (uiDataSize - uiOffset)); memcpy(((pucBuffer + uiDataSize) - uiOffset), pCircularBuffer->pucBufferStartPtr, uiOffset); } UpdateReadPtr(pCircularBuffer, uiDataSize); return(uiDataSize); }
void Microphone( void *pvParameters ) { long lRetVal = -1; #ifdef MULTICAST //Wait for Network Connection while((!IS_IP_ACQUIRED(g_ulStatus))) { } #endif //MULTICAST while(1) { while(g_ucMicStartFlag || g_loopback) { int iBufferFilled = 0; iBufferFilled = GetBufferSize(pRecordBuffer); if(iBufferFilled >= (2*PACKET_SIZE)) { if(!g_loopback) { #ifndef MULTICAST lRetVal = sendto(g_UdpSock.iSockDesc, \ (char*)(pRecordBuffer->pucReadPtr),PACKET_SIZE,\ 0,(struct sockaddr*)&(g_UdpSock.Client),\ sizeof(g_UdpSock.Client)); if(lRetVal < 0) { UART_PRINT("Unable to send data\n\r"); LOOP_FOREVER(); } #else //MULTICAST lRetVal = SendMulticastPacket(); if(lRetVal < 0) { UART_PRINT("Unable to send data\n\r"); LOOP_FOREVER(); } #endif //MULTICAST } else { lRetVal = FillBuffer(pPlayBuffer,\ (unsigned char*)(pRecordBuffer->pucReadPtr), \ PACKET_SIZE); if(lRetVal < 0) { UART_PRINT("Unable to fill buffer\n\r"); } g_iReceiveCount++; } UpdateReadPtr(pRecordBuffer, PACKET_SIZE); g_iSentCount++; } } MAP_UtilsDelay(1000); } }
status_t APESource::read( MediaBuffer **out, const ReadOptions *options) { *out = NULL; uint32_t newframe = 0 , firstbyte = 0; ///LOGV("APESource::read"); int64_t seekTimeUs; ReadOptions::SeekMode mode; int32_t bitrate = 0; if (!mMeta->findInt32(kKeyBitRate, &bitrate) || !mMeta->findInt32(kKeySampleRate, &mSampleRate)) { LOGI("no bitrate"); return ERROR_UNSUPPORTED; } if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) { { int64_t duration = 0; int64_t seektabletime = 0; if ((mTotalsample > 0) && (mTableOfContents[0] > 0) && (mSamplesPerFrame > 0) && mMeta->findInt64(kKeyDuration, &duration)) { ape_parser_ctx_t ape_ctx; uint32_t filepos, blocks_to_skip; ape_ctx.samplerate = mSampleRate; ape_ctx.blocksperframe = mSamplesPerFrame; ape_ctx.totalframes = mTotalFrame; ape_ctx.seektable = mTableOfContents; ape_ctx.firstframe = mTableOfContents[0]; if (ape_calc_seekpos_by_microsecond(&ape_ctx, seekTimeUs, &newframe, &filepos, &firstbyte, &blocks_to_skip) < 0) { LOGD("getseekto error exit"); return ERROR_UNSUPPORTED; } mCurrentPos = filepos; mCurrentTimeUs = (int64_t)newframe * mSamplesPerFrame * 1000000ll / mSampleRate; LOGD("getseekto seekTimeUs=%lld, Actual time%lld, filepos%x,frame %d, seekbyte %d", seekTimeUs, mCurrentTimeUs, mCurrentPos, newframe, firstbyte); } else { LOGD("getseekto parameter error exit"); return ERROR_UNSUPPORTED; } } } if ((mFileoffset != 0) && (mCurrentPos >= mFileoffset)) { LOGD("APESource::readAt to end filesize %x curr: %x", mFileoffset, mCurrentPos); return ERROR_END_OF_STREAM; } MediaBuffer *buffer; status_t err = mGroup->acquire_buffer(&buffer); if (err != OK) { LOGD("APESource::acquire_buffer fail"); return err; } size_t frame_size; frame_size = kMaxFrameSize; ssize_t n = 0; #ifdef ENABLE_MMRIOTHREAD if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) { ResetReadioPtr(mCurrentPos); } n = ReadBitsteam(buffer->data(), frame_size); #else ///frame_size = mMaxBufferSize; n = mDataSource->readAt(mCurrentPos, buffer->data(), frame_size); #endif ///LOGE("APESource::readAt %x, %x, %d, %d, %d, %d, %d", mCurrentPos, buffer->data(), buffer->size(), mTotalsample, bitrate, mSampleRate, frame_size); //ssize_t n = mDataSource->readAt(mCurrentPos, buffer->data(), frame_size); if ((mFileoffset != 0) && ((mCurrentPos + n) >= mFileoffset)) { frame_size = mFileoffset - mCurrentPos; memset(buffer->data() + frame_size, 0, n - frame_size); } else if ((n < (ssize_t)frame_size) && (n > 0)) { frame_size = n; off64_t fileoffset = 0; mDataSource->getSize(&fileoffset); LOGD("APESource::readAt not enough read %d frmsize %x, filepos %x, filesize %x", n, frame_size, mCurrentPos + frame_size, fileoffset); //if ((mCurrentPos + frame_size) >= fileoffset // && (mCurrentPos + frame_size) < mTableOfContents[mTotalFrame - 1]) if ((mCurrentPos + frame_size) >= fileoffset && (mCurrentPos + frame_size) < mTableOfContents[mSt_bound- 1]) { memset(buffer->data(), 0, buffer->size()); /// for this file is not complete error, frame buffer should not transfer to avoid decoding noise data. LOGD("APESource::file is not enough to end --> memset"); } } else if (n <= 0) { buffer->release(); buffer = NULL; LOGD("APESource::readAt EOS filepos %x frmsize %d", mCurrentPos, frame_size); return ERROR_END_OF_STREAM; } buffer->set_range(0, frame_size); if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) { buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs); buffer->meta_data()->setInt32(kKeyNemFrame, newframe); buffer->meta_data()->setInt32(kKeySeekByte, firstbyte); } buffer->meta_data()->setInt32(kKeyIsSyncFrame, 1); mCurrentPos += frame_size; mCurrentTimeUs += (int64_t)(frame_size * 8000000ll) / bitrate ; #ifdef ENABLE_MMRIOTHREAD UpdateReadPtr(frame_size); #endif *out = buffer; ///LOGE("APESource::kKeyTime done %x %lld", mCurrentPos, mCurrentTimeUs); return OK; }