MUS_MESSAGE SoundPipe::PipeOut(uint32_t **puiBuffToFill, size_t uiFetchAmt, MUS_MESSAGE *msg, size_t *puiNumWrittem) { //ReportError1("In the OUT with: %i", m_cbBuf.GetBuffSamps()); size_t uiStartPos = *puiNumWrittem; if ((m_msgPipeOutStatus == MUS_STATUS_UNDER_FLOW) && !(IsEnoughBuffer()) && (m_msgPipeInStatus != MUS_STATUS_SOURCE_EOF) && (m_msgPipeInStatus != MUS_STATUS_ERROR) && (m_msgPipeInStatus != MUS_STATUS_BUF_FULL)) { for (int i=0; i<m_iNumChan; i++) { ReportError("Here in Underflow land"); int32_t iLen = uiFetchAmt; uint32_t *iter = &puiBuffToFill[i][uiStartPos]; while(iLen--) *(iter++) = 0; } *puiNumWrittem = 0; return MUS_STATUS_UNDER_FLOW; } //ReportError("Not in the underflow area"); if (m_msgPipeOutStatus == MUS_STATUS_UNDER_FLOW) m_msgPipeOutStatus = MUS_STATUS_PLAYING; if ((m_msgPipeOutStatus == MUS_STATUS_WAITING_FOR_SONG) || (m_msgPipeOutStatus == MUS_STATUS_ERROR) || ((m_msgPipeInStatus == MUS_STATUS_INITIAL_BUFFERING) && (!(IsEnoughBuffer())))) { //ReportError("Here in the other null write"); for (int i=0; i<m_iNumChan; i++) { int32_t iLen = uiFetchAmt; uint32_t *iter = &puiBuffToFill[i][uiStartPos]; while(iLen--) *(iter++) = 0; } *puiNumWrittem = 0; return MUS_STATUS_WAITING_FOR_SONG; } //ReportError("Writing actual music bytes"); uint32_t *puiWriteBuf; uint32_t uiCheckEnd = m_cbBuf.GetBuffSamps(); if (!uiCheckEnd) { if (m_msgPipeInStatus == MUS_STATUS_SOURCE_EOF) { m_msgPipeOutStatus = MUS_INTMES_END_OF_SONG_REACHED; return MUS_INTMES_END_OF_SONG_REACHED; } else { m_msgPipeOutStatus = MUS_INTMES_BUFFER_UNDERFLOW; return MUS_INTMES_BUFFER_UNDERFLOW; } } uint32_t uiTmpFetch = uiFetchAmt; if (uiCheckEnd < uiFetchAmt) { uiTmpFetch = uiCheckEnd; for (int i=0; i<m_iNumChan; i++) { int iLen = uiFetchAmt; uint32_t *iter = &puiBuffToFill[i][uiStartPos]; while(iLen--) *(iter++) = 0; } } size_t uiNumRead;// = uiFetchAmt; if (m_iFadeHelper) { FadeDown(); } fixed real[FFT_DECOMP_SIZE]; memset(real, 0, sizeof(fixed) * FFT_DECOMP_SIZE); for (int i=0; i<m_iNumChan; i++) { puiWriteBuf = m_cbBuf.GetSamples(i); if (m_bUseResampFilt) { m_rfResample.Filter(puiWriteBuf, (size_t) RESAMPLE_PADDING, &uiNumRead, (int16_t *) m_puiWorkingBuf, uiTmpFetch*2); *puiNumWrittem = uiNumRead; int16_t *pConvBuf = (int16_t *) m_puiWorkingBuf; for (int i=0; i<FFT_DECOMP_SIZE; i++) { real[i] += (pConvBuf[i] / 2); } m_btfSongLvlEQ[i].Filter((int16_t *) m_puiWorkingBuf, (size_t) 0, &uiNumRead, (int16_t *) &puiBuffToFill[i][uiStartPos], uiTmpFetch*2); } else { int16_t *pConvBuf = (int16_t *) puiWriteBuf; for (int i=0; i<FFT_DECOMP_SIZE; i++) { real[i] += (pConvBuf[i] / 2); } m_btfSongLvlEQ[i].Filter((int16_t *) puiWriteBuf, (size_t) RESAMPLE_PADDING, &uiNumRead, (int16_t *) &puiBuffToFill[i][uiStartPos], uiTmpFetch*2); /*for (int i=0; i<m_iNumChan; i++) { for(int j=0;j<uiFetchAmt;j++) { puiBuffToFill[i][uiStartPos+j] = puiWriteBuf[j]; } }*/ uiNumRead = uiFetchAmt; } } if (m_BPMDetect.DetectBeat(real)) { m_iTicks[m_iCurrentTick++] = 1; } else { m_iTicks[m_iCurrentTick++] = 0; } if (m_iCurrentTick >= BPM_TICK_HIST) m_iCurrentTick = 0; int32_t iBPMCnt = 0; for (int i=0;i<BPM_TICK_HIST;i++) { if (m_iTicks[i]) iBPMCnt++; } m_iBPMCnt = iBPMCnt * 3; /*if ((m_iCurrentTick % 32) == 0) ReportError1("BPM = %i", iBPMCnt);*/ *msg = m_cbBuf.AdvanceCurPnt(uiNumRead); if (*msg == MUS_INTMES_BUFFER_UNDERFLOW) { ReportError("Underflow"); m_msgPipeOutStatus = MUS_STATUS_UNDER_FLOW; } else if (*msg == MUS_INTMES_BUFFER_UNDERFLOW) { m_msgPipeOutStatus = MUS_INTMES_END_OF_SONG_REACHED; } //ReportError("End of pipeout"); return *msg; }
boolean Segment::Off () { if (!IsOff()) { FadeDown(); } return IsOff(); }