private void MapShapesWithAudio(PowerPointSlide slide) { var relativeSlideId = GetRelativeSlideIndex(slide.ID); XmlParser xmlParser; string searchRule = string.Format("^({0}|{1})", SpeechShapePrefixOld, SpeechShapePrefix); var shapes = slide.GetShapesWithMediaType(PpMediaType.ppMediaTypeSound, new Regex(searchRule)); if (shapes.Count == 0) { return; } try { xmlParser = new XmlParser(string.Format(_tempShapAudioXmlFormat, relativeSlideId + 1)); } catch (ArgumentException) { // xml does not exist, means this page is either a new page or // created dues to pasting. For either case we do nothing return; } // iterate through all shapes, skip audios that are not generated speech foreach (var shape in shapes) { var audio = new Audio(); // detect audio type switch (shape.MediaFormat.AudioSamplingRate) { case Audio.GeneratedSamplingRate: audio.Type = Audio.AudioType.Auto; break; case Audio.RecordedSamplingRate: audio.Type = Audio.AudioType.Record; break; default: MessageBox.Show(TextCollection.RecorderUnrecognizeAudio); break; } // derive matched id from shape name var temp = shape.Name.Split(new[] { ' ' }); audio.MatchScriptID = Int32.Parse(temp[2]); // get corresponding audio audio.Name = shape.Name; audio.SaveName = _tempFullPath + xmlParser.GetCorrespondingAudio(audio.Name); audio.Length = AudioHelper.GetAudioLengthString(audio.SaveName); audio.LengthMillis = AudioHelper.GetAudioLength(audio.SaveName); // maintain a sorted audio list // Note: here relativeID == slide.Index - 1 if (audio.MatchScriptID >= _audioList[relativeSlideId].Count) { _audioList[relativeSlideId].Add(audio); } else { _audioList[relativeSlideId].Insert(audio.MatchScriptID, audio); } // match id > total script count -> script does not exsit if (audio.MatchScriptID >= _scriptList[relativeSlideId].Count) { audio.MatchScriptID = -1; } } }