// frmContactEditor-Sound.cpp - frmContactEditor Sound tab subroutines. // // (c) 2012-2016 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include "frmContactEditor.h" void frmContactEditor::AddSound( wxCommandEvent& event ) { // Bring up a form to add sound. frmContactEditorSound *frameCESound = new frmContactEditorSound ( this ); frameCESound->SetEditorMode(FALSE); frameCESound->SetupPointers(&ContactEditorData.SoundsList, &ContactEditorData.SoundsListAltID, &ContactEditorData.SoundsListPID, &ContactEditorData.SoundsListType, &ContactEditorData.SoundsListAudioType, &ContactEditorData.SoundsListAudioEncType, &ContactEditorData.SoundsListTokens, &ContactEditorData.SoundsListMediatype, &ContactEditorData.SoundsListPref, lboSounds, (intValueSeek)); frameCESound->ShowModal(); delete frameCESound; frameCESound = NULL; } void frmContactEditor::ModifySound( wxCommandEvent& event ) { // Bring up a form to modify sound. long longSelected = -1; int intSelectedData = 0; if (lboSounds->GetItemCount() == 0 || !GetSelectedItem(lboSounds, &longSelected, &intSelectedData)){ return; } frmContactEditorSound *frameCESound = new frmContactEditorSound ( this ); frameCESound->SetupPointers(&ContactEditorData.SoundsList, &ContactEditorData.SoundsListAltID, &ContactEditorData.SoundsListPID, &ContactEditorData.SoundsListType, &ContactEditorData.SoundsListAudioType, &ContactEditorData.SoundsListAudioEncType, &ContactEditorData.SoundsListTokens, &ContactEditorData.SoundsListMediatype, &ContactEditorData.SoundsListPref, lboSounds, intSelectedData); frameCESound->SetEditorMode(TRUE); frameCESound->ShowModal(); delete frameCESound; frameCESound = NULL; } void frmContactEditor::DeleteSound( wxCommandEvent& event ) { // Bring up a form to delete sound. long longSelected = -1; int intSelectedData = 0; if (lboSounds->GetItemCount() == 0 || !GetSelectedItem(lboSounds, &longSelected, &intSelectedData)){ return; } lboSounds->DeleteItem(longSelected); DeleteMapData(intSelectedData, &ContactEditorData.SoundsList, &ContactEditorData.SoundsListAltID, &ContactEditorData.SoundsListPID, &ContactEditorData.SoundsListType, &ContactEditorData.SoundsListAudioType, &ContactEditorData.SoundsListAudioEncType, &ContactEditorData.SoundsListTokens, &ContactEditorData.SoundsListMediatype, &ContactEditorData.SoundsListPref); } void frmContactEditor::PlaySoundDetach() { // Play the sound and detach. if (!AudioStreamPlaybackPointer->openFromMemory(base64dec.c_str(), base64declen)){ // Can't load file. We must flee... // Also show an error message too. wxMessageBox(_("This file is in an audio format that is unsupported or is not an audio file."), _("Error opening audio file"), wxICON_ERROR); return; } btnStop->Enable(); AudioStreamPlaybackPointer->play(); while (AudioStreamPlaybackPointer->getStatus() == sf::SoundSource::Playing){ // We poll this every 100ms in order to conserve CPU usage. SleepFor(10000000); } btnStop->Disable(); btnPlay->Enable(); } void frmContactEditor::PlaySound( wxCommandEvent& event ) { // Play the sound. long longSelected = -1; int intSelectedData = 0; if (AudioStreamPlaybackPointer == nullptr){ AudioStreamPlaybackPointer = new AudioStream; } // Check if sound is still being played and if it is, stop it. if (AudioStreamPlaybackPointer->getStatus() == sf::SoundSource::Playing){ AudioStreamPlaybackPointer->stop(); } if (lboSounds->GetItemCount() == 0 || !GetSelectedItem(lboSounds, &longSelected, &intSelectedData)){ return; } btnPlay->Disable(); std::map::iterator initier; initier = ContactEditorData.SoundsList.find(intSelectedData); base64dec = base64_decode(initier->second); base64declen = base64dec.size(); std::thread AudioPlaybackThread(&frmContactEditor::PlaySoundDetach, this); AudioPlaybackThread.detach(); return; } void frmContactEditor::StopSound( wxCommandEvent& event ) { // Stop the sound. if (AudioStreamPlaybackPointer != nullptr && AudioStreamPlaybackPointer->getStatus() == sf::SoundSource::Playing){ AudioStreamPlaybackPointer->stop(); } btnStop->Disable(); btnPlay->Enable(); return; } void frmContactEditor::SaveSound( wxCommandEvent &event ) { // Save the sound. long longSelected = -1; int intSelectedData = 0; if (lboSounds->GetItemCount() == 0 || !GetSelectedItem(lboSounds, &longSelected, &intSelectedData)){ return; } wxString FileTypes; wxString FinalFilename; std::map::iterator initier; std::map::iterator soundtypeiter; initier = ContactEditorData.SoundsList.find(intSelectedData); soundtypeiter = ContactEditorData.SoundsListAudioType.find(intSelectedData); // Open up the dialog to save the picture. wxFileDialog ExportDlg(this, wxT("Save Sound"), wxT(""), wxT(""), FileTypes, wxFD_SAVE|wxFD_OVERWRITE_PROMPT); if (ExportDlg.ShowModal() == wxID_CANCEL){ return; } // Write out the picture to the file. wxFile SoundFile; if (SoundFile.Open(ExportDlg.GetPath(), wxFile::write)){ std::string base64dec; initier = ContactEditorData.SoundsList.find(intSelectedData); base64dec = base64_decode(initier->second); SoundFile.Write(base64dec.c_str(), (size_t)base64dec.size()); SoundFile.Close(); } else { wxMessageBox(_("An error occured whilst saving the sound. Check that you have free space and permissions to write the picture at this location."), _("Sound save error"), wxOK, this); return; } }