svcore
1.9
|
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 00002 00003 /* 00004 Sonic Visualiser 00005 An audio file viewer and annotation editor. 00006 Centre for Digital Music, Queen Mary, University of London. 00007 This file copyright 2006 Chris Cannam. 00008 00009 This program is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU General Public License as 00011 published by the Free Software Foundation; either version 2 of the 00012 License, or (at your option) any later version. See the file 00013 COPYING included with this distribution for more information. 00014 */ 00015 00016 #include "PlayParameterRepository.h" 00017 #include "PlayParameters.h" 00018 #include "Playable.h" 00019 00020 #include <iostream> 00021 00022 PlayParameterRepository * 00023 PlayParameterRepository::m_instance = new PlayParameterRepository; 00024 00025 PlayParameterRepository * 00026 PlayParameterRepository::getInstance() 00027 { 00028 return m_instance; 00029 } 00030 00031 PlayParameterRepository::~PlayParameterRepository() 00032 { 00033 } 00034 00035 void 00036 PlayParameterRepository::addPlayable(const Playable *playable) 00037 { 00038 cerr << "PlayParameterRepository:addPlayable playable = " << playable << endl; 00039 00040 if (!getPlayParameters(playable)) { 00041 00042 // Give all playables the same type of play parameters for the 00043 // moment 00044 00045 cerr << "PlayParameterRepository:addPlayable: Adding play parameters for " << playable << endl; 00046 00047 PlayParameters *params = new PlayParameters; 00048 m_playParameters[playable] = params; 00049 00050 params->setPlayClipId 00051 (playable->getDefaultPlayClipId()); 00052 00053 params->setPlayAudible 00054 (playable->getDefaultPlayAudible()); 00055 00056 connect(params, SIGNAL(playParametersChanged()), 00057 this, SLOT(playParametersChanged())); 00058 00059 connect(params, SIGNAL(playClipIdChanged(QString)), 00060 this, SLOT(playClipIdChanged(QString))); 00061 00062 cerr << "Connected play parameters " << params << " for playable " 00063 << playable << " to this " << this << endl; 00064 } 00065 } 00066 00067 void 00068 PlayParameterRepository::removePlayable(const Playable *playable) 00069 { 00070 if (m_playParameters.find(playable) == m_playParameters.end()) { 00071 cerr << "WARNING: PlayParameterRepository::removePlayable: unknown playable " << playable << endl; 00072 return; 00073 } 00074 delete m_playParameters[playable]; 00075 m_playParameters.erase(playable); 00076 } 00077 00078 void 00079 PlayParameterRepository::copyParameters(const Playable *from, const Playable *to) 00080 { 00081 if (!getPlayParameters(from)) { 00082 cerr << "ERROR: PlayParameterRepository::copyParameters: source playable unknown" << endl; 00083 return; 00084 } 00085 if (!getPlayParameters(to)) { 00086 cerr << "WARNING: PlayParameterRepository::copyParameters: target playable unknown, adding it now" << endl; 00087 addPlayable(to); 00088 } 00089 getPlayParameters(to)->copyFrom(getPlayParameters(from)); 00090 } 00091 00092 PlayParameters * 00093 PlayParameterRepository::getPlayParameters(const Playable *playable) 00094 { 00095 if (m_playParameters.find(playable) == m_playParameters.end()) return 0; 00096 return m_playParameters.find(playable)->second; 00097 } 00098 00099 void 00100 PlayParameterRepository::playParametersChanged() 00101 { 00102 PlayParameters *params = dynamic_cast<PlayParameters *>(sender()); 00103 emit playParametersChanged(params); 00104 } 00105 00106 void 00107 PlayParameterRepository::playClipIdChanged(QString id) 00108 { 00109 PlayParameters *params = dynamic_cast<PlayParameters *>(sender()); 00110 for (PlayableParameterMap::iterator i = m_playParameters.begin(); 00111 i != m_playParameters.end(); ++i) { 00112 if (i->second == params) { 00113 emit playClipIdChanged(i->first, id); 00114 return; 00115 } 00116 } 00117 } 00118 00119 void 00120 PlayParameterRepository::clear() 00121 { 00122 // cerr << "PlayParameterRepository: PlayParameterRepository::clear" << endl; 00123 while (!m_playParameters.empty()) { 00124 delete m_playParameters.begin()->second; 00125 m_playParameters.erase(m_playParameters.begin()); 00126 } 00127 } 00128 00129 PlayParameterRepository::EditCommand::EditCommand(PlayParameters *params) : 00130 m_params(params) 00131 { 00132 m_from.copyFrom(m_params); 00133 m_to.copyFrom(m_params); 00134 } 00135 00136 void 00137 PlayParameterRepository::EditCommand::setPlayMuted(bool muted) 00138 { 00139 m_to.setPlayMuted(muted); 00140 } 00141 00142 void 00143 PlayParameterRepository::EditCommand::setPlayAudible(bool audible) 00144 { 00145 m_to.setPlayAudible(audible); 00146 } 00147 00148 void 00149 PlayParameterRepository::EditCommand::setPlayPan(float pan) 00150 { 00151 m_to.setPlayPan(pan); 00152 } 00153 00154 void 00155 PlayParameterRepository::EditCommand::setPlayGain(float gain) 00156 { 00157 m_to.setPlayGain(gain); 00158 } 00159 00160 void 00161 PlayParameterRepository::EditCommand::setPlayClipId(QString id) 00162 { 00163 m_to.setPlayClipId(id); 00164 } 00165 00166 void 00167 PlayParameterRepository::EditCommand::execute() 00168 { 00169 m_params->copyFrom(&m_to); 00170 } 00171 00172 void 00173 PlayParameterRepository::EditCommand::unexecute() 00174 { 00175 m_params->copyFrom(&m_from); 00176 } 00177 00178 QString 00179 PlayParameterRepository::EditCommand::getName() const 00180 { 00181 QString name; 00182 QString multiname = tr("Adjust Playback Parameters"); 00183 00184 int changed = 0; 00185 00186 if (m_to.isPlayAudible() != m_from.isPlayAudible()) { 00187 name = tr("Change Playback Mute State"); 00188 if (++changed > 1) return multiname; 00189 } 00190 00191 if (m_to.getPlayGain() != m_from.getPlayGain()) { 00192 name = tr("Change Playback Gain"); 00193 if (++changed > 1) return multiname; 00194 } 00195 00196 if (m_to.getPlayPan() != m_from.getPlayPan()) { 00197 name = tr("Change Playback Pan"); 00198 if (++changed > 1) return multiname; 00199 } 00200 00201 if (m_to.getPlayClipId() != m_from.getPlayClipId()) { 00202 name = tr("Change Playback Sample"); 00203 if (++changed > 1) return multiname; 00204 } 00205 00206 if (name == "") return multiname; 00207 return name; 00208 } 00209