You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rosegarden/src/sound/ControlBlock.cpp

180 lines
5.2 KiB

/*
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 <cstring>
#include "ControlBlock.h"
namespace Rosegarden
{
ControlBlock::ControlBlock(unsigned int maxTrackId)
: m_maxTrackId(maxTrackId),
m_solo(false),
m_routing(true),
m_thruFilter(0),
m_recordFilter(0),
m_selectedTrack(0)
{
m_metronomeInfo.muted = true;
m_metronomeInfo.instrumentId = 0;
for (unsigned int i = 0; i < CONTROLBLOCK_MAX_NB_TRACKS; ++i) {
m_trackInfo[i].muted = true;
m_trackInfo[i].deleted = true;
m_trackInfo[i].armed = true;
m_trackInfo[i].instrumentId = 0;
}
}
ControlBlock::ControlBlock()
{
// DO NOT initialize anything - this ctor is meant to be used by
// the sequencer, through a placement new over an mmapped file.
}
void ControlBlock::updateTrackData(Track* t)
{
if (t) {
setInstrumentForTrack(t->getId(), t->getInstrument());
setTrackArmed(t->getId(), t->isArmed());
setTrackMuted(t->getId(), t->isMuted());
setTrackDeleted(t->getId(), false);
setTrackChannelFilter(t->getId(), t->getMidiInputChannel());
setTrackDeviceFilter(t->getId(), t->getMidiInputDevice());
if (t->getId() > m_maxTrackId)
m_maxTrackId = t->getId();
}
}
void ControlBlock::setInstrumentForTrack(TrackId trackId, InstrumentId instId)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].instrumentId = instId;
}
InstrumentId ControlBlock::getInstrumentForTrack(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].instrumentId;
return 0;
}
void ControlBlock::setTrackMuted(TrackId trackId, bool mute)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].muted = mute;
}
bool ControlBlock::isTrackMuted(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].muted;
return true;
}
void ControlBlock::setTrackArmed(TrackId trackId, bool armed)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].armed = armed;
}
bool ControlBlock::isTrackArmed(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].armed;
return false;
}
void ControlBlock::setTrackDeleted(TrackId trackId, bool deleted)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].deleted = deleted;
}
bool ControlBlock::isTrackDeleted(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].deleted;
return true;
}
void ControlBlock::setTrackChannelFilter(TrackId trackId, char channel)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].channelFilter = channel;
}
char ControlBlock::getTrackChannelFilter(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].channelFilter;
return -1;
}
void ControlBlock::setTrackDeviceFilter(TrackId trackId, DeviceId device)
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
m_trackInfo[trackId].deviceFilter = device;
}
DeviceId ControlBlock::getTrackDeviceFilter(TrackId trackId) const
{
if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
return m_trackInfo[trackId].deviceFilter;
return Device::ALL_DEVICES;
}
bool ControlBlock::isInstrumentMuted(InstrumentId instrumentId) const
{
for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
if (m_trackInfo[i].instrumentId == instrumentId &&
!m_trackInfo[i].deleted && !m_trackInfo[i].muted)
return false;
}
return true;
}
bool ControlBlock::isInstrumentUnused(InstrumentId instrumentId) const
{
for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
if (m_trackInfo[i].instrumentId == instrumentId &&
!m_trackInfo[i].deleted)
return false;
}
return true;
}
InstrumentId ControlBlock::getInstrumentForEvent(unsigned int dev, unsigned int chan)
{
for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
if (!m_trackInfo[i].deleted && m_trackInfo[i].armed) {
if (((m_trackInfo[i].deviceFilter == Device::ALL_DEVICES) ||
(m_trackInfo[i].deviceFilter == dev)) &&
((m_trackInfo[i].channelFilter == -1) ||
(m_trackInfo[i].channelFilter == chan)))
return m_trackInfo[i].instrumentId;
}
}
// There is not a matching filter, return the selected track instrument
return getInstrumentForTrack(getSelectedTrack());
}
}