Пример #1
0
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;
}
Пример #2
0
boolean Segment::Off () {
    if (!IsOff()) {
	FadeDown();
    }
    return IsOff();
}