private void SetupSoundControls() { if (m_innerView.WritingSystemsToDisplay == null) return; // should get called again when it is set up. if (m_innerView.RootBox == null) return; // called again in MakeRoot, when information more complete. int index = -1; foreach (var ws in m_innerView.WritingSystemsToDisplay) { index++; var pws = ws as WritingSystemDefinition; if (pws == null || !pws.IsVoice || MultiStringSelectionUtils.GetSelAtStartOfWs(m_innerView.RootBox, m_innerView.Flid, index, ws) == null) { continue; } var soundFieldControl = new ShortSoundFieldControl(); m_soundControls.Add(soundFieldControl); // todo: one for each audio one soundFieldControl.Visible = true; soundFieldControl.PlayOnly = false; var filename = m_innerView.Cache.DomainDataByFlid.get_MultiStringAlt(m_innerView.HvoObj, m_innerView.Flid, ws.Handle).Text ?? ""; string path; if (String.IsNullOrEmpty(filename)) { // Provide a filename for copying an existing file to. CreateNewSoundFilename(out path); } else { var mediaDir = FdoFileHelper.GetMediaDir(m_innerView.Cache.LangProject.LinkedFilesRootDir); Directory.CreateDirectory(mediaDir); // Palaso media library does not cope if it does not exist. path = Path.Combine(mediaDir, filename.Normalize(NormalizationForm.FormC)); // Windows in total defiance of the Unicode standard does not consider alternate normalizations // of file names equal. The name in our string will always be NFD. From 7.2.2 we are saving files // in NFC, but files from older versions could be NFD, so we need to check both. This is not // foolproof...don't know any way to look for all files that might exist with supposedly equivalent // names not normalized at all. if (!File.Exists(path)) { var tryPath = path.Normalize(NormalizationForm.FormD); if (File.Exists(tryPath)) path = tryPath; } } soundFieldControl.Path = path; soundFieldControl.BeforeStartingToRecord += soundFieldControl_BeforeStartingToRecord; soundFieldControl.SoundRecorded += soundFieldControl_SoundRecorded; soundFieldControl.SoundDeleted += soundFieldControl_SoundDeleted; Controls.Add(soundFieldControl); } }
/// <summary> /// If we're shutting down, this might return null /// </summary> IWritingSystem WsForSoundField(ShortSoundFieldControl sc, out int wsIndex) { int index = m_soundControls.IndexOf(sc); wsIndex = -1; foreach (var ws in m_innerView.WritingSystems) { wsIndex++; var pws = ws as WritingSystemDefinition; if (pws == null || !pws.IsVoice) continue; if (index == 0) return ws; index--; } return null; //throw new InvalidOperationException("trying to get WS for sound field failed"); }