view Source/TouchKeys/LogPlayback.h @ 20:dfff66c07936

Lots of minor changes to support building on Visual Studio. A few MSVC-specific #ifdefs to eliminate things Visual Studio doesn't like. This version now compiles on Windows (provided liblo, Juce and pthread are present) but the TouchKeys device support is not yet enabled. Also, the code now needs to be re-checked on Mac and Linux.
author Andrew McPherson <andrewm@eecs.qmul.ac.uk>
date Sun, 09 Feb 2014 18:40:51 +0000
parents 3580ffe87dc8
children
line wrap: on
line source
/*
  TouchKeys: multi-touch musical keyboard control software
  Copyright (c) 2013 Andrew McPherson

  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 3 of the License, or
  (at your option) any later version.
 
  This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 
  =====================================================================
 
  LogPlayback.h: basic functions for playing back a recorded TouchKeys log.
*/

#ifndef __touchkeys__LogPlayback__
#define __touchkeys__LogPlayback__

#include <iostream>
#include <fstream>
#include <vector>
#include <boost/bind.hpp>
#include "MidiInputController.h"
#include "KeyTouchFrame.h"
#include "PianoKeyboard.h"
#include "../Utility/Scheduler.h"

using namespace std;

class LogPlayback {
public:
    // ***** Constructor and Destructor *****
    LogPlayback(PianoKeyboard& keyboard, MidiInputController& midi);
    
    ~LogPlayback();
    
    // ***** Log File Playback *****
    // File management
    bool openLogFiles(string const& touchPath, string const& midiPath);
    void closeLogFiles();
    
    // Start, stop, pause, resume
    void startPlayback(timestamp_type startingTimestamp = 0);
    void stopPlayback();
    void pausePlayback();
    void resumePlayback();
    
    // Seek to location and/or change the rate
    void seekPlayback(timestamp_type newTimestamp);
    void changePlaybackRate(float rate);
    
    // Scheduler action functions
    timestamp_type nextTouchEvent();
    timestamp_type nextMidiEvent();
   
private:
    bool readNextTouchFrame();
    bool readNextMidiFrame();
    
	PianoKeyboard& keyboard_;	    // Main keyboard controller
    MidiInputController& midiInputController_; // MIDI controller
    Scheduler playbackScheduler_;   // Scheduler thread to send messages
    Scheduler::action touchAction_; // Scheduler action for playing next touch
    Scheduler::action midiAction_;  // Scheduler action for playing next MIDI event
    
    ifstream touchLog_;           // Log file for key touches
    ifstream midiLog_;            // Log file for MIDI data
    
    bool open_;                   // Whether files are open
    bool playing_;                // Whether playback is active
    bool paused_;                 // Whether playback is active, but paused
    bool usingTouch_, usingMidi_; // Whether touch and MIDI files are present
    float playbackRate_;          // Current playback rate (default 1.0)
    
    KeyTouchFrame nextTouch_;     // Next touch frame to play
    int nextTouchMidiNote_;       // MIDI note for next touch frame to play
    timestamp_type nextTouchTimestamp_; // When the next touch happens
    std::vector<unsigned char> nextMidi_;    // Next MIDI event to play
    timestamp_type nextMidiTimestamp_;  // When the next MIDI event happens
    timestamp_type lastMidiTimestamp_;  // When the last MIDI event happened
    timestamp_type pauseTimestamp_;     // When the playback was paused
    timestamp_diff_type timestampOffset_;   // Difference between file and current playback time
};

#endif /* defined(__touchkeys__LogPlayback__) */