char* MimeHeaders::readFromBuffer(char* src) { clear(); while (*src) { char* peol = strchr(src, '\n'); if (peol == NULL) return strchr(src, 0); else if (peol == src) return src + 1; else if (peol == (src + 1) && *src == '\r') return src + 2; *peol = 0; char* delim = strchr(src, ':'); if (delim) { *delim = 0; MimeHeader& H = mVals[allocSlot()]; H.name = lrtrimp(src); H.value = lrtrimp(delim + 1); H.flags = 0; } src = peol + 1; } return src; }
void MimeHeaders::addBool(const char* name, bool lValue) { MimeHeader& H = mVals[allocSlot()]; H.name = name; H.value = lValue ? "true" : "false"; H.flags = 0; }
void MimeHeaders::addString(const char* name, const char* szValue, unsigned flags) { if (szValue == NULL) return; MimeHeader& H = mVals[allocSlot()]; H.name = name; H.value = szValue; H.flags = flags; }
void MimeHeaders::addULong(const char* name, unsigned lValue) { MimeHeader& H = mVals[allocSlot()]; H.name = name; char szBuffer[20]; _ultoa(lValue, szBuffer, 10); H.value = mir_strdup(szBuffer); H.flags = 2; }
bool Imuse::startSound(const char *soundName, int volGroupId, int hookId, int volume, int pan, int priority, Track *otherTrack) { Common::StackLock lock(_mutex); Track *track = NULL; int i; // If the track is already playing then there is absolutely no // reason to start it again, the existing track should be modified // instead of starting a new copy of the track for (i = 0; i < MAX_IMUSE_TRACKS + MAX_IMUSE_FADETRACKS; i++) { // Filenames are case insensitive, see findTrack if (!scumm_stricmp(_track[i]->soundName, soundName)) { if (gDebugLevel == DEBUG_IMUSE || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) printf("Imuse::startSound(): Track '%s' already playing.\n", soundName); return true; } } // Priority Level 127 appears to mean "load but don't play", so // within our paradigm this is a much lower priority than everything // else we're doing if (priority == 127) priority = -1; int l = allocSlot(priority); if (l == -1) { warning("Imuse::startSound() Can't start sound - no free slots"); return false; } track = _track[l]; // Reset the track memset(track, 0, sizeof(Track)); track->pan = pan * 1000; track->vol = volume * 1000; track->volGroupId = volGroupId; track->curHookId = hookId; track->priority = priority; track->curRegion = -1; track->trackId = l; int bits = 0, freq = 0, channels = 0; strcpy(track->soundName, soundName); track->soundDesc = _sound->openSound(soundName, volGroupId); if (!track->soundDesc) return false; bits = _sound->getBits(track->soundDesc); channels = _sound->getChannels(track->soundDesc); freq = _sound->getFreq(track->soundDesc); assert(bits == 8 || bits == 12 || bits == 16); assert(channels == 1 || channels == 2); assert(0 < freq && freq <= 65535); track->feedSize = freq * channels * 2; track->mixerFlags = kFlag16Bits; if (channels == 2) track->mixerFlags |= kFlagStereo | kFlagReverseStereo; if (otherTrack && otherTrack->used && !otherTrack->toBeRemoved) { track->curRegion = otherTrack->curRegion; track->dataOffset = otherTrack->dataOffset; track->regionOffset = otherTrack->regionOffset; } track->stream = Audio::makeQueuingAudioStream(freq, track->mixerFlags & kFlagStereo); g_system->getMixer()->playStream(track->getType(), &track->handle, track->stream, -1, track->getVol(), track->getPan(), DisposeAfterUse::YES, false, (track->mixerFlags & kFlagReverseStereo) != 0); track->used = true; return true; }
void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, int volGroupId, Audio::AudioStream *input, int hookId, int volume, int priority, Track *otherTrack) { Common::StackLock lock(_mutex, "IMuseDigital::startSound()"); debug(5, "IMuseDigital::startSound(%d) - begin func", soundId); int l = allocSlot(priority); if (l == -1) { warning("IMuseDigital::startSound() Can't start sound - no free slots"); return; } debug(5, "IMuseDigital::startSound(%d, trackId:%d)", soundId, l); Track *track = _track[l]; // Reset the track memset(track, 0, sizeof(Track)); track->pan = 64; track->vol = volume * 1000; track->soundId = soundId; track->volGroupId = volGroupId; track->curHookId = hookId; track->soundPriority = priority; track->curRegion = -1; track->soundType = soundType; track->trackId = l; int bits = 0, freq = 0, channels = 0; track->souStreamUsed = (input != 0); if (track->souStreamUsed) { _mixer->playStream(track->getType(), &track->mixChanHandle, input, -1, track->getVol(), track->getPan()); } else { strcpy(track->soundName, soundName); track->soundDesc = _sound->openSound(soundId, soundName, soundType, volGroupId, -1); if (!track->soundDesc) track->soundDesc = _sound->openSound(soundId, soundName, soundType, volGroupId, 1); if (!track->soundDesc) track->soundDesc = _sound->openSound(soundId, soundName, soundType, volGroupId, 2); if (!track->soundDesc) return; track->sndDataExtComp = _sound->isSndDataExtComp(track->soundDesc); bits = _sound->getBits(track->soundDesc); channels = _sound->getChannels(track->soundDesc); freq = _sound->getFreq(track->soundDesc); if ((soundId == kTalkSoundID) && (soundType == IMUSE_BUNDLE)) { if (_vm->_actorToPrintStrFor != 0xFF && _vm->_actorToPrintStrFor != 0) { Actor *a = _vm->derefActor(_vm->_actorToPrintStrFor, "IMuseDigital::startSound"); freq = (freq * a->_talkFrequency) / 256; track->pan = a->_talkPan; track->vol = a->_talkVolume * 1000; } // The volume is set to zero, when using subtitles only setting in COMI if (ConfMan.getBool("speech_mute") || _vm->VAR(_vm->VAR_VOICE_MODE) == 2) { track->vol = 0; } } assert(bits == 8 || bits == 12 || bits == 16); assert(channels == 1 || channels == 2); assert(0 < freq && freq <= 65535); track->feedSize = freq * channels; if (channels == 2) track->mixerFlags = kFlagStereo; if ((bits == 12) || (bits == 16)) { track->mixerFlags |= kFlag16Bits; track->feedSize *= 2; } else if (bits == 8) { track->mixerFlags |= kFlagUnsigned; } else error("IMuseDigital::startSound(): Can't handle %d bit samples", bits); if (otherTrack && otherTrack->used && !otherTrack->toBeRemoved) { track->curRegion = otherTrack->curRegion; track->dataOffset = otherTrack->dataOffset; track->regionOffset = otherTrack->regionOffset; track->dataMod12Bit = otherTrack->dataMod12Bit; } track->stream = Audio::makeQueuingAudioStream(freq, track->mixerFlags & kFlagStereo); _mixer->playStream(track->getType(), &track->mixChanHandle, track->stream, -1, track->getVol(), track->getPan()); } track->used = true; }