222
DecoderPtr SoundManager::loadVoice(const std::string &voicefile, Sound_Loudness **lipdata)
222
DecoderPtr SoundManager::loadVoice(const std::string &voicefile)
224
224
DecoderPtr decoder = getDecoder();
225
225
// Workaround: Bethesda at some point converted some of the files to mp3, but the references were kept as .wav.
234
234
decoder->open(file);
237
NameLoudnessRefMap::iterator lipiter = mVoiceLipNameMap.find(voicefile);
238
if(lipiter != mVoiceLipNameMap.end())
240
*lipdata = lipiter->second;
244
mVoiceLipBuffers.insert(mVoiceLipBuffers.end(), Sound_Loudness());
245
lipiter = mVoiceLipNameMap.insert(
246
std::make_pair(voicefile, &mVoiceLipBuffers.back())
249
mOutput->loadLoudnessAsync(decoder, lipiter->second);
251
*lipdata = lipiter->second;
274
259
sound.reset(new Stream(pos, 1.0f, basevol, 1.0f, minDistance, maxDistance,
275
260
Play_Normal|Play_TypeVoice|Play_3D));
276
mOutput->streamSound3D(decoder, sound);
261
mOutput->streamSound3D(decoder, sound, true);
401
386
std::string voicefile = "Sound/"+filename;
403
Sound_Loudness *loudness;
404
388
mVFS->normalizeFilename(voicefile);
405
DecoderPtr decoder = loadVoice(voicefile, &loudness);
407
if(!loudness->isReady())
408
mPendingSaySounds[ptr] = std::make_pair(decoder, loudness);
389
DecoderPtr decoder = loadVoice(voicefile);
391
MWBase::World *world = MWBase::Environment::get().getWorld();
392
const osg::Vec3f pos = world->getActorHeadTransform(ptr).getTrans();
394
SaySoundMap::iterator oldIt = mActiveSaySounds.find(ptr);
395
if (oldIt != mActiveSaySounds.end())
411
MWBase::World *world = MWBase::Environment::get().getWorld();
412
const osg::Vec3f pos = world->getActorHeadTransform(ptr).getTrans();
414
SaySoundMap::iterator oldIt = mActiveSaySounds.find(ptr);
415
if (oldIt != mActiveSaySounds.end())
417
mOutput->finishStream(oldIt->second.first);
418
mActiveSaySounds.erase(oldIt);
421
MWBase::SoundStreamPtr sound = playVoice(decoder, pos, (ptr == MWMechanics::getPlayer()));
423
mActiveSaySounds.insert(std::make_pair(ptr, std::make_pair(sound, loudness)));
397
mOutput->finishStream(oldIt->second);
398
mActiveSaySounds.erase(oldIt);
401
MWBase::SoundStreamPtr sound = playVoice(decoder, pos, (ptr == MWMechanics::getPlayer()));
403
mActiveSaySounds.insert(std::make_pair(ptr, sound));
426
405
catch(std::exception &e)
434
413
SaySoundMap::const_iterator snditer = mActiveSaySounds.find(ptr);
435
414
if(snditer != mActiveSaySounds.end())
437
MWBase::SoundStreamPtr sound = snditer->second.first;
438
Sound_Loudness *loudness = snditer->second.second;
439
float sec = mOutput->getStreamOffset(sound);
440
return loudness->getLoudnessAtTime(sec);
416
MWBase::SoundStreamPtr sound = snditer->second;
417
return mOutput->getStreamLoudness(sound);
452
429
std::string voicefile = "Sound/"+filename;
454
Sound_Loudness *loudness;
455
431
mVFS->normalizeFilename(voicefile);
456
DecoderPtr decoder = loadVoice(voicefile, &loudness);
432
DecoderPtr decoder = loadVoice(voicefile);
458
if(!loudness->isReady())
459
mPendingSaySounds[MWWorld::ConstPtr()] = std::make_pair(decoder, loudness);
434
SaySoundMap::iterator oldIt = mActiveSaySounds.find(MWWorld::ConstPtr());
435
if (oldIt != mActiveSaySounds.end())
462
SaySoundMap::iterator oldIt = mActiveSaySounds.find(MWWorld::ConstPtr());
463
if (oldIt != mActiveSaySounds.end())
465
mOutput->finishStream(oldIt->second.first);
466
mActiveSaySounds.erase(oldIt);
469
mActiveSaySounds.insert(std::make_pair(MWWorld::ConstPtr(),
470
std::make_pair(playVoice(decoder, osg::Vec3f(), true), loudness)));
437
mOutput->finishStream(oldIt->second);
438
mActiveSaySounds.erase(oldIt);
441
mActiveSaySounds.insert(std::make_pair(MWWorld::ConstPtr(),
442
playVoice(decoder, osg::Vec3f(), true)));
473
444
catch(std::exception &e)
481
452
SaySoundMap::const_iterator snditer = mActiveSaySounds.find(ptr);
482
453
if(snditer != mActiveSaySounds.end())
484
if(mOutput->isStreamPlaying(snditer->second.first))
455
if(mOutput->isStreamPlaying(snditer->second))
488
return mPendingSaySounds.find(ptr) == mPendingSaySounds.end();
491
462
void SoundManager::stopSay(const MWWorld::ConstPtr &ptr)
493
464
SaySoundMap::iterator snditer = mActiveSaySounds.find(ptr);
494
465
if(snditer != mActiveSaySounds.end())
496
mOutput->finishStream(snditer->second.first);
467
mOutput->finishStream(snditer->second);
497
468
mActiveSaySounds.erase(snditer);
499
mPendingSaySounds.erase(ptr);
904
SayDecoderMap::iterator penditer = mPendingSaySounds.begin();
905
while(penditer != mPendingSaySounds.end())
907
Sound_Loudness *loudness = penditer->second.second;
908
if(loudness->isReady())
911
DecoderPtr decoder = penditer->second.first;
914
MWBase::SoundStreamPtr sound;
915
MWWorld::ConstPtr ptr = penditer->first;
917
SaySoundMap::iterator old = mActiveSaySounds.find(ptr);
918
if (old != mActiveSaySounds.end())
920
mOutput->finishStream(old->second.first);
921
mActiveSaySounds.erase(old);
924
if(ptr == MWWorld::ConstPtr())
925
sound = playVoice(decoder, osg::Vec3f(), true);
928
MWBase::World *world = MWBase::Environment::get().getWorld();
929
const osg::Vec3f pos = world->getActorHeadTransform(ptr).getTrans();
930
sound = playVoice(decoder, pos, (ptr == MWMechanics::getPlayer()));
932
mActiveSaySounds.insert(std::make_pair(ptr, std::make_pair(sound, loudness)));
934
catch(std::exception &e) {
935
std::cerr<< "Sound Error: "<<e.what() <<std::endl;
938
mPendingSaySounds.erase(penditer++);
944
874
SaySoundMap::iterator sayiter = mActiveSaySounds.begin();
945
875
while(sayiter != mActiveSaySounds.end())
947
877
MWWorld::ConstPtr ptr = sayiter->first;
948
MWBase::SoundStreamPtr sound = sayiter->second.first;
878
MWBase::SoundStreamPtr sound = sayiter->second;
949
879
if(!ptr.isEmpty() && sound->getIs3D())
951
881
MWBase::World *world = MWBase::Environment::get().getWorld();
1040
970
SaySoundMap::iterator sayiter = mActiveSaySounds.begin();
1041
971
for(;sayiter != mActiveSaySounds.end();++sayiter)
1043
MWBase::SoundStreamPtr sound = sayiter->second.first;
973
MWBase::SoundStreamPtr sound = sayiter->second;
1044
974
sound->setBaseVolume(volumeFromType(sound->getPlayType()));
1045
975
mOutput->updateStream(sound);
1080
1010
SaySoundMap::iterator sayiter = mActiveSaySounds.find(old);
1081
1011
if(sayiter != mActiveSaySounds.end())
1083
SoundLoudnessPair sndlist = sayiter->second;
1013
MWBase::SoundStreamPtr stream = sayiter->second;
1084
1014
mActiveSaySounds.erase(sayiter);
1085
mActiveSaySounds[updated] = sndlist;
1087
SayDecoderMap::iterator penditer = mPendingSaySounds.find(old);
1088
if(penditer != mPendingSaySounds.end())
1090
DecoderLoudnessPair dl = penditer->second;
1091
mPendingSaySounds.erase(penditer);
1092
mPendingSaySounds[updated] = dl;
1015
mActiveSaySounds[updated] = stream;
1175
1098
mActiveSounds.clear();
1176
1099
SaySoundMap::iterator sayiter = mActiveSaySounds.begin();
1177
1100
for(;sayiter != mActiveSaySounds.end();++sayiter)
1178
mOutput->finishStream(sayiter->second.first);
1101
mOutput->finishStream(sayiter->second);
1179
1102
mActiveSaySounds.clear();
1180
1103
TrackList::iterator trkiter = mActiveTracks.begin();
1181
1104
for(;trkiter != mActiveTracks.end();++trkiter)
1182
1105
mOutput->finishStream(*trkiter);
1183
1106
mActiveTracks.clear();
1184
mPendingSaySounds.clear();
1185
1107
mUnderwaterSound.reset();