MIDIInDevice.h
上传用户:fs3633
上传日期:2021-05-14
资源大小:909k
文件大小:8k
源码类别:

midi

开发平台:

Visual C++

  1. #ifndef MIDI_IN_DEVICE_H
  2. #define MIDI_IN_DEVICE_H
  3. /*******************************************************************************
  4.  * MIDIInDevice.h - Interface for CMIDIInDevice and related classes.
  5.  *
  6.  * Copyright (C) 2002 Leslie Sanford
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with this library; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  *
  22.  * Contact: jabberdabber@hotmail.com
  23.  *
  24.  * Last modified: 07/30/2003
  25.  *
  26.  * Note: You must link to the winmm.lib to use these classes.
  27.  ******************************************************************************/
  28. #pragma warning(disable:4786) // Disable annoying template warnings
  29. //--------------------------------------------------------------------
  30. // Dependencies
  31. //--------------------------------------------------------------------
  32. // Necessary for Windows data types
  33. #include "stdafx.h"
  34. #include <mmsystem.h>
  35. // Necessary for exception classes derived from std::exception
  36. #include <exception> 
  37. // Necessary for header queue used by CHeaderQueue
  38. #include <queue>
  39. namespace midi
  40. {
  41.     //----------------------------------------------------------------
  42.     // Class declarations
  43.     //----------------------------------------------------------------
  44.     //----------------------------------------------------------------
  45.     // CMIDIReceiver
  46.     //
  47.     // An abstract class representing objects that receive messages
  48.     // from CMIDIInDevice objects. A CMIDIReceiver object registers
  49.     // itself with a CMIDIInDevice object. It will then receive all
  50.     // messages that are recorded.
  51.     //----------------------------------------------------------------
  52.     class CMIDIReceiver
  53.     {
  54.     public:
  55.         virtual ~CMIDIReceiver() {}
  56.         // Receives short messages
  57.         virtual void ReceiveMsg(DWORD Msg, DWORD TimeStamp) = 0;
  58.         // Receives long messages
  59.         virtual void ReceiveMsg(LPSTR Msg, DWORD BytesRecorded,
  60.                                 DWORD TimeStamp) = 0;
  61.         // Called when an invalid short message is received
  62.         virtual void OnError(DWORD Msg, DWORD TimeStamp) = 0;
  63.         // Called when an invalid long message is received
  64.         virtual void OnError(LPSTR Msg, DWORD BytesRecorded,
  65.                              DWORD TimeStamp) = 0;
  66.     };
  67.     //----------------------------------------------------------------
  68.     // CMIDIInDevice exception classes
  69.     //----------------------------------------------------------------
  70.     // Encapsulates the midiInGetErrorText messages
  71.     class CMIDIInException : public std::exception
  72.     {
  73.     public:
  74.         CMIDIInException(MMRESULT ErrCode) throw()
  75.         { ::midiInGetErrorText(ErrCode, m_ErrMsg, sizeof m_ErrMsg); }
  76.         const char *what() const throw() { return m_ErrMsg; }
  77.     private:
  78.         char m_ErrMsg[128];
  79.     };
  80.     // Thrown when memory allocation fails within a CMIDIInDevice 
  81.     // object
  82.     class CMIDIInMemFailure : public std::bad_alloc
  83.     {
  84.     public:
  85.         const char *what() const throw()
  86.         { return "Memory allocation within a CMIDIInDevice object "
  87.                  "failed."; }
  88.     };
  89.     // Thrown when a CMIDIInDevice is unable to create a signalling 
  90.     // event
  91.     class CMIDIInEventFailure : public std::exception
  92.     {
  93.     public:
  94.         const char *what() const throw()
  95.         { return "Unable to create a signalling event for "
  96.                  "CMIDIInDevice object."; }
  97.     };
  98.     // Thrown when a CMIDIInDevice is unable to create a worker thread
  99.     class CMIDIInThreadFailure : public std::exception
  100.     {
  101.     public:
  102.         const char *what() const throw()
  103.         { return "Unable to create worker thread for CMIDIInDevice "
  104.                  "object."; }
  105.     };
  106.     //----------------------------------------------------------------
  107.     // CMIDIInDevice
  108.     //
  109.     // This class represents MIDI input devices. 
  110.     //----------------------------------------------------------------
  111.     class CMIDIInDevice
  112.     {
  113.     public:
  114.         // For constructing a CMIDIInDevice object in an closed state
  115.         CMIDIInDevice();
  116.         // For constructing a CMIDIInDevice object in an closed state and
  117.         // initializing the MIDI receiver
  118.         CMIDIInDevice(CMIDIReceiver &Receiver);
  119.         // For constructing a CMIDIInDevice object in an opened state
  120.         CMIDIInDevice(UINT DeviceId, CMIDIReceiver &Receiver);
  121.         // Destruction
  122.         ~CMIDIInDevice();
  123.         // Opens the MIDI input device
  124.         void Open(UINT DeviceId);
  125.         // Closes the MIDI input device
  126.         void Close();
  127.         // Adds a buffer to receive system exclusive messages
  128.         void AddSysExBuffer(LPSTR Buffer, DWORD BufferLength);
  129.         // Starts the recording process
  130.         void StartRecording();
  131.         // Stops the recording process
  132.         void StopRecording();
  133.         // Sets the current MIDI receiver. Returns the previous 
  134.         // receiver.
  135.         CMIDIReceiver *SetReceiver(CMIDIReceiver &Receiver);
  136.         // Returns true if the device is open
  137.         bool IsOpen() const;
  138.         // Returns true if the device is recording
  139.         bool IsRecording() const;
  140.         // Gets Id for this device
  141.         UINT GetDevID() const;
  142.         // Gets the number of MIDI input devices on this system
  143.         static UINT GetNumDevs() { return midiInGetNumDevs(); }
  144.         // Gets the capabilities of a particular MIDI input device
  145.         // The results are stored in the MIDIINCAPS parameter.
  146.         static void GetDevCaps(UINT DeviceId, MIDIINCAPS &Caps);
  147.     // Private methods
  148.     private:
  149.         // Copying and assignment not allowed
  150.         CMIDIInDevice(const CMIDIInDevice &);
  151.         CMIDIInDevice &operator = (const CMIDIInDevice &);
  152.         // Creates an event for signalling the header thread
  153.         bool CreateEvent();
  154.         // Called by Windows when a MIDI input event occurs
  155.         static void CALLBACK MidiInProc(HMIDIIN MidiIn, UINT Msg,
  156.                                         DWORD Instance, DWORD Param1, 
  157.                                         DWORD Param2);
  158.         // Thread function for managing headers
  159.         static DWORD WINAPI HeaderProc(LPVOID Parameter);
  160.     // Private class declarations
  161.     private:
  162.         // Encapsulates the MIDIHDR structure for MIDI input
  163.         class CMIDIInHeader
  164.         {
  165.         public:
  166.             CMIDIInHeader(HMIDIIN DevHandle, LPSTR Buffer, 
  167.                           DWORD BufferLength);
  168.             ~CMIDIInHeader();
  169.             // Add the buffer for receiving system exclusive messages
  170.             void AddSysExBuffer();
  171.         private:
  172.             HMIDIIN m_DevHandle;
  173.             MIDIHDR m_MIDIHdr;
  174.         };
  175.         // Thread safe queue for storing CMIDIInHeader objects
  176.         class CHeaderQueue
  177.         {
  178.         public:
  179.             CHeaderQueue();
  180.             ~CHeaderQueue();
  181.             void AddHeader(CMIDIInHeader *Header);
  182.             void RemoveHeader();
  183.             void RemoveAll();
  184.             bool IsEmpty();
  185.         private:
  186.             std::queue<CMIDIInHeader *> m_HdrQueue;
  187.             CRITICAL_SECTION m_CriticalSection;
  188.         };
  189.     // Private attributes and constants
  190.     private:
  191.         HMIDIIN        m_DevHandle;
  192.         HANDLE         m_Event;
  193. CWinThread    *m_Thread;
  194.         CMIDIReceiver *m_Receiver;
  195.         CHeaderQueue   m_HdrQueue;
  196.         enum State { CLOSED, OPENED, RECORDING } m_State;
  197.     };
  198. }
  199. #endif