// 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 (!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 (!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 (!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 (!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;
}
}