diff options
Diffstat (limited to 'src/sound/MappedDevice.cpp')
-rw-r--r-- | src/sound/MappedDevice.cpp | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/src/sound/MappedDevice.cpp b/src/sound/MappedDevice.cpp new file mode 100644 index 0000000..619be2a --- /dev/null +++ b/src/sound/MappedDevice.cpp @@ -0,0 +1,250 @@ +// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*- + +/* + Rosegarden + A sequencer and musical notation editor. + + This program is Copyright 2000-2008 + Guillaume Laurent <glaurent@telegraph-road.org>, + Chris Cannam <cannam@all-day-breakfast.com>, + Richard Bown <bownie@bownie.com> + + The moral right of the authors to claim authorship of this work + has been asserted. + + This program 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; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "MappedDevice.h" +#include "MappedInstrument.h" +#include <iostream> + +namespace Rosegarden +{ + +MappedDevice::MappedDevice(): + std::vector<MappedInstrument*>(), + m_id(Device::NO_DEVICE), + m_type(Device::Midi), + m_name("Unconfigured device"), + m_connection(""), + m_direction(MidiDevice::Play), + m_recording(false) +{} + +MappedDevice::MappedDevice(DeviceId id, + Device::DeviceType type, + std::string name, + std::string connection): + std::vector<MappedInstrument*>(), + m_id(id), + m_type(type), + m_name(name), + m_connection(connection), + m_direction(MidiDevice::Play), + m_recording(false) +{} + +MappedDevice::~MappedDevice() +{} + +MappedDevice::MappedDevice(const MappedDevice &mD): + std::vector<MappedInstrument*>() +{ + clear(); + + for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++) + this->push_back(new MappedInstrument(**it)); + + m_id = mD.getId(); + m_type = mD.getType(); + m_name = mD.getName(); + m_connection = mD.getConnection(); + m_direction = mD.getDirection(); + m_recording = mD.isRecording(); +} + +void +MappedDevice::clear() +{ + MappedDeviceIterator it; + + for (it = this->begin(); it != this->end(); it++) + delete (*it); + + this->erase(this->begin(), this->end()); +} + +MappedDevice& +MappedDevice::operator+(const MappedDevice &mD) +{ + for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++) + this->push_back(new MappedInstrument(**it)); + + return *this; +} + +MappedDevice& +MappedDevice::operator=(const MappedDevice &mD) +{ + if (&mD == this) + return * this; + + clear(); + + for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++) + this->push_back(new MappedInstrument(**it)); + + m_id = mD.getId(); + m_type = mD.getType(); + m_name = mD.getName(); + m_connection = mD.getConnection(); + m_direction = mD.getDirection(); + m_recording = mD.isRecording(); + + return *this; +} + + +QDataStream& +operator>>(QDataStream &dS, MappedDevice *mD) +{ + int instruments = 0; + dS >> instruments; + + MappedInstrument mI; + while (!dS.atEnd() && instruments) { + dS >> mI; + mD->push_back(new MappedInstrument(mI)); + instruments--; + } + + QString name; + unsigned int id, dType; + QString connection; + unsigned int direction; + unsigned int recording; + + dS >> id; + dS >> dType; + dS >> name; + dS >> connection; + dS >> direction; + dS >> recording; + mD->setId(id); + mD->setType(Device::DeviceType(dType)); + mD->setName(std::string(name.data())); + mD->setConnection(connection.data()); + mD->setDirection(MidiDevice::DeviceDirection(direction)); + mD->setRecording((bool)recording); + +#ifdef DEBUG_MAPPEDDEVICE + + if (instruments) { + std::cerr << "MappedDevice::operator>> - " + << "wrong number of events received" << std::endl; + } +#endif + + return dS; +} + + +QDataStream& +operator>>(QDataStream &dS, MappedDevice &mD) +{ + int instruments; + dS >> instruments; + + MappedInstrument mI; + + while (!dS.atEnd() && instruments) { + dS >> mI; + mD.push_back(new MappedInstrument(mI)); + instruments--; + } + + unsigned int id, dType; + QString name; + QString connection; + unsigned int direction; + unsigned int recording; + + dS >> id; + dS >> dType; + dS >> name; + dS >> connection; + dS >> direction; + dS >> recording; + mD.setId(id); + mD.setType(Device::DeviceType(dType)); + mD.setName(std::string(name.data())); + mD.setConnection(connection.data()); + mD.setDirection(MidiDevice::DeviceDirection(direction)); + mD.setRecording((bool)recording); + +#ifdef DEBUG_MAPPEDDEVICE + + if (instruments) { + std::cerr << "MappedDevice::operator>> - " + << "wrong number of events received" << std::endl; + } +#endif + + return dS; +} + +QDataStream& +operator<<(QDataStream &dS, MappedDevice *mD) +{ + dS << (int)mD->size(); + + for (MappedDeviceIterator it = mD->begin(); it != mD->end(); it++) + dS << (*it); + + dS << (unsigned int)(mD->getId()); + dS << (int)(mD->getType()); + dS << QString(mD->getName().c_str()); + dS << QString(mD->getConnection().c_str()); + dS << mD->getDirection(); + dS << (unsigned int)(mD->isRecording()); + +#ifdef DEBUG_MAPPEDDEVICE + + std::cerr << "MappedDevice::operator>> - wrote \"" << mD->getConnection() << "\"" + << std::endl; +#endif + + return dS; +} + +QDataStream& +operator<<(QDataStream &dS, const MappedDevice &mD) +{ + dS << (int)mD.size(); + + for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++) + dS << (*it); + + dS << (unsigned int)(mD.getId()); + dS << (int)(mD.getType()); + dS << QString(mD.getName().c_str()); + dS << QString(mD.getConnection().c_str()); + dS << mD.getDirection(); + dS << (unsigned int)(mD.isRecording()); + +#ifdef DEBUG_MAPPEDDEVICE + + std::cerr << "MappedDevice::operator>> - wrote \"" << mD.getConnection() << "\"" + << std::endl; +#endif + + return dS; +} + +} + |