/** ** Mix channels to stereo 32 bit. ** ** @param buffer Buffer for mixed samples. ** @param size Number of samples that fits into buffer. ** ** @return How many channels become free after mixing them. */ static int MixChannelsToStereo32(int *buffer, int size) { int new_free_channels = 0; for (int channel = 0; channel < MaxChannels; ++channel) { if (Channels[channel].Playing && Channels[channel].Sample) { //Wyrmgus start if ((Channels[channel].Point & 1)) { fprintf(stderr, "Sound effect error; Index: %d, Voice: %d, Origin: \"%s\", Sample Length: %d, Sample Filename: \"%s\"\n", Channels[channel].Point, Channels[channel].Voice, (Channels[channel].Unit && Channels[channel].Unit->Base) ? UnitManager.GetSlotUnit(Channels[channel].Unit->Id).Type->Ident.c_str() : "", Channels[channel].Sample->Len, Channels[channel].Sample->File.c_str()); } //Wyrmgus end int i = MixSampleToStereo32(Channels[channel].Sample, Channels[channel].Point, Channels[channel].Volume, Channels[channel].Stereo, buffer, size); Channels[channel].Point += i; Assert(Channels[channel].Point <= Channels[channel].Sample->Len); if (Channels[channel].Point == Channels[channel].Sample->Len) { ChannelFinished(channel); ++new_free_channels; } } } return new_free_channels; }
/** ** Stop all channels */ void StopAllChannels() { SDL_LockMutex(Audio.Lock); for (int i = 0; i < MaxChannels; ++i) { if (Channels[i].Playing) { ChannelFinished(i); } } SDL_UnlockMutex(Audio.Lock); }
/** ** Stop a channel ** ** @param channel Channel to stop */ void StopChannel(int channel) { SDL_LockMutex(Audio.Lock); if (channel >= 0 && channel < MaxChannels) { if (Channels[channel].Playing) { ChannelFinished(channel); } } SDL_UnlockMutex(Audio.Lock); }
/** ** Mix channels to stereo 32 bit. ** ** @param buffer Buffer for mixed samples. ** @param size Number of samples that fits into buffer. ** ** @return How many channels become free after mixing them. */ static int MixChannelsToStereo32(int *buffer, int size) { int new_free_channels = 0; for (int channel = 0; channel < MaxChannels; ++channel) { if (Channels[channel].Playing && Channels[channel].Sample) { int i = MixSampleToStereo32(Channels[channel].Sample, Channels[channel].Point, Channels[channel].Volume, Channels[channel].Stereo, buffer, size); Channels[channel].Point += i; Assert(Channels[channel].Point <= Channels[channel].Sample->Len); if (Channels[channel].Point == Channels[channel].Sample->Len) { ChannelFinished(channel); ++new_free_channels; } } } return new_free_channels; }