/*
- Copyright (C) 2000 Paul Davis
+ Copyright (C) 2000 Paul Davis
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
#include "pbd/ringbufferNPT.h"
#include "ardour/ardour.h"
-#include "ardour/configuration.h"
#include "ardour/diskstream.h"
#include "ardour/midi_playlist.h"
#include "ardour/midi_ring_buffer.h"
-#include "ardour/midi_state_tracker.h"
#include "ardour/utils.h"
struct tm;
class Session;
class MidiDiskstream : public Diskstream
-{
+{
public:
MidiDiskstream (Session &, const string& name, Diskstream::Flag f = Recordable);
MidiDiskstream (Session &, const XMLNode&);
float playback_buffer_load() const;
float capture_buffer_load() const;
-
+
void get_playback(MidiBuffer& dst, nframes_t start, nframes_t end);
void set_record_enabled (bool yn);
/* stateful */
XMLNode& get_state(void);
- int set_state(const XMLNode& node);
+ int set_state(const XMLNode&, int version);
void monitor_input (bool);
- boost::shared_ptr<SMFSource> write_source () { return _write_source; }
-
+ MidiRingBuffer<nframes_t>* playback_buffer () { return _playback_buf; }
+ MidiRingBuffer<nframes_t>* capture_buffer () { return _capture_buf; }
+ boost::shared_ptr<SMFSource> write_source () { return _write_source; }
+
int set_destructive (bool yn); // doom!
-
+
void set_note_mode (NoteMode m);
-
- uint16_t get_channel_mask() {
+
+ uint16_t get_channel_mask() {
uint16_t playback_mask = _playback_buf->get_channel_mask();
#ifndef NDEBUG
uint16_t capture_mask = _capture_buf->get_channel_mask();
}
void set_channel_mode(ChannelMode mode, uint16_t mask) {
- _playback_buf->set_channel_mode(mode, mask);
- _capture_buf->set_channel_mode(mode, mask);
+ _playback_buf->set_channel_mode(mode, mask);
+ _capture_buf->set_channel_mode(mode, mask);
}
-
+
ChannelMode get_channel_mode() {
ChannelMode playback_mode = _playback_buf->get_channel_mode();
#ifndef NDEBUG
protected:
friend class Session;
+ friend class Butler;
/* the Session is the only point of access for these
because they require that the Session is "inactive"
void non_realtime_input_change ();
void non_realtime_locate (nframes_t location);
- static void set_readahed_frames( nframes_t frames_ahead ) { midi_readahead = frames_ahead; }
+ static void set_readahead_frames(nframes_t frames_ahead) { midi_readahead = frames_ahead; }
protected:
int seek (nframes_t which_sample, bool complete_refill = false);
/* The two central butler operations */
int do_flush (RunContext context, bool force = false);
int do_refill ();
-
+
int do_refill_with_alloc();
int read (nframes_t& start, nframes_t cnt, bool reversed);
int use_pending_capture_data (XMLNode& node);
void get_input_sources ();
- void check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record);
void set_align_style_from_io();
-
+
void engage_record_enable ();
void disengage_record_enable ();
MidiPort* _source_port;
boost::shared_ptr<SMFSource> _write_source;
nframes_t _last_flush_frame;
- NoteMode _note_mode;
- MidiStateTracker _midi_state_tracker;
+ NoteMode _note_mode;
volatile gint _frames_written_to_ringbuffer;
volatile gint _frames_read_from_ringbuffer;
};