mix all streams in the play-list into pBuffer; mixlength is nSamples the data is processed before mixing if needed (eg. ramping) */
| 1134 | the data is processed before mixing if needed (eg. ramping) |
| 1135 | */ |
| 1136 | void CMusicSystem::MixStreams(void *pBuffer, int nSamples) |
| 1137 | { |
| 1138 | for (TPatternPlayInfoVecIt It=m_vecPlayingPatterns.begin();It!=m_vecPlayingPatterns.end();) |
| 1139 | { |
| 1140 | int nSamplesToRead=nSamples; |
| 1141 | SMusicPatternPlayInfo &PlayInfo=(*It); |
| 1142 | bool bStreamEnd=false; |
| 1143 | if (PlayInfo.eBlendType==EBlend_Stop) |
| 1144 | { |
| 1145 | bStreamEnd=true; |
| 1146 | }else |
| 1147 | { |
| 1148 | GUARD_HEAP; // AMD64 note: here was a Memory Corruption |
| 1149 | switch (PlayInfo.eBlendType) |
| 1150 | { |
| 1151 | case EBlend_ToEnd: |
| 1152 | { |
| 1153 | int nLength=PlayInfo.pPatternInstance->GetSamplesToEnd(); |
| 1154 | if (nSamplesToRead>=nLength) |
| 1155 | { |
| 1156 | nSamplesToRead=nLength; |
| 1157 | bStreamEnd=true; |
| 1158 | } |
| 1159 | break; |
| 1160 | } |
| 1161 | } |
| 1162 | PlayInfo.pPatternInstance->GetPCMData((signed long*)m_pMixBuffer, nSamplesToRead); |
| 1163 | |
| 1164 | switch (PlayInfo.eBlendType) |
| 1165 | { |
| 1166 | case EBlend_FadeOut: |
| 1167 | { |
| 1168 | if (FadeStream(PlayInfo, (signed short*)m_pMixBuffer, nSamplesToRead)) |
| 1169 | bStreamEnd=true; |
| 1170 | break; |
| 1171 | } |
| 1172 | } |
| 1173 | //const int nSize = 1024*1024*4; |
| 1174 | //static int arrBuffer[nSize]; |
| 1175 | //memset (arrBuffer, 0xCE, sizeof(arrBuffer)); |
| 1176 | //memcpy (pBuffer, m_pMixBuffer, nSamplesToRead*4); |
| 1177 | //memset(pBuffer, 0, nSamplesToRead*4); |
| 1178 | CS_DSP_MixBuffers(pBuffer, m_pMixBuffer, nSamplesToRead, m_nSampleRate, PlayInfo.pPatternInstance->GetPattern()->GetLayeringVolume(), 128, CS_16BITS | CS_STEREO); |
| 1179 | /* |
| 1180 | signed short *destptr = (signed short *)pBuffer; |
| 1181 | signed int *srcptr = (signed int *)pBuffer; |
| 1182 | |
| 1183 | for (int count = 0; count < nSamplesToRead; count++) |
| 1184 | { |
| 1185 | signed int lval,rval; |
| 1186 | lval = *srcptr++; |
| 1187 | rval = *srcptr++; |
| 1188 | |
| 1189 | *destptr++ = (signed short)( lval < -32768 ? -32768 : lval > 32767 ? 32767 : lval); |
| 1190 | *destptr++ = (signed short)( rval < -32768 ? -32768 : rval > 32767 ? 32767 : rval); |
| 1191 | } |
| 1192 | /**/ |
| 1193 |
nothing calls this directly
no test coverage detected