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

midi

开发平台:

Visual C++

  1. #ifndef MIDI_OUT_DEVICE_H
  2. #define MIDI_OUT_DEVICE_H
  3. /*******************************************************************************
  4.  * MIDIOutDevice.h - Interface for CMIDIOutDevice 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: 08/19/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.     // CMIDIOutDevice exception classes
  46.     //----------------------------------------------------------------
  47.     // Encapsulates the midiOutGetErrorText messages
  48.     class CMIDIOutException : public std::exception
  49.     {
  50.     public:
  51.         CMIDIOutException(MMRESULT ErrCode) throw()
  52.         { ::midiOutGetErrorText(ErrCode, m_ErrMsg, sizeof m_ErrMsg); }
  53.         const char *what() const throw() { return m_ErrMsg; }
  54.     private:
  55.         char m_ErrMsg[128];
  56.     };
  57.     // Thrown when memory allocation fails within a CMIDIOutDevice 
  58.     // object
  59.     class CMIDIOutMemFailure : public std::bad_alloc
  60.     {
  61.     public:
  62.         const char *what() const throw()
  63.         { return "Memory allocation within a CMIDIOutDevice object "
  64.                  "failed."; }
  65.     };
  66.     // Thrown when a CMIDIOutDevice is unable to create a signalling 
  67.     // event
  68.     class CMIDIOutEventFailure : public std::exception
  69.     {
  70.     public:
  71.         const char *what() const throw()
  72.         { return "Unable to create a signalling event for "
  73.                  "CMIDIOutDevice object."; }
  74.     };
  75.     // Thrown when a CMIDIOutDevice is unable to create a worker 
  76.     // thread
  77.     class CMIDIOutThreadFailure : public std::exception
  78.     {
  79.     public:
  80.         const char *what() const throw()
  81.         { return "Unable to create worker thread for CMIDIOutDevice "
  82.                  "object."; }
  83.     };
  84.     //----------------------------------------------------------------
  85.     // CMIDIOutDevice
  86.     //
  87.     // This class represents MIDI output devices.
  88.     //----------------------------------------------------------------
  89.     class CMIDIOutDevice
  90.     {
  91.     public:
  92.         // For constructing a CMIDIOutDevice in an closed state
  93.         CMIDIOutDevice();
  94.         // For constructing a CMIDIOutDevice in an opened state
  95.         CMIDIOutDevice(UINT DeviceId);
  96.         // Destruction
  97.         ~CMIDIOutDevice();
  98.         // Opens the MIDI output device
  99.         void Open(UINT DeviceId);
  100.         // Closes the MIDI output device
  101.         void Close();
  102.         // Sends short message
  103.         void SendMsg(DWORD Msg);
  104.         // Sends long message
  105.         void SendMsg(LPSTR Msg, DWORD MsgLength);
  106.         // Returns true if the device is open
  107.         bool IsOpen() const;
  108.         // Gets the Id for this device
  109.         UINT GetDevID() const;
  110.         // Gets the number of MIDI output devices on this system
  111.         static UINT GetNumDevs() { return midiOutGetNumDevs(); }
  112.         // Gets the capabilities of a particular MIDI output device
  113.         // The results are stored in the MIDIOUTCAPS parameter.
  114.         static void GetDevCaps(UINT DeviceId, MIDIOUTCAPS &Caps);
  115.     // Private methods
  116.     private:
  117.         // Copying and assignment not allowed
  118.         CMIDIOutDevice(const CMIDIOutDevice &);
  119.         CMIDIOutDevice &operator = (const CMIDIOutDevice &);
  120.         // Creates an event for signalling the header thread
  121.         bool CreateEvent();
  122.         // Called by Windows when a MIDI output event occurs
  123.         static void CALLBACK MidiOutProc(HMIDIOUT MidiOut, UINT Msg,
  124.                                          DWORD Instance, DWORD Param1, 
  125.                                          DWORD Param2);
  126.         // Thread function for managing headers
  127.         static DWORD WINAPI HeaderProc(LPVOID Parameter);
  128.     // Private class declarations
  129.     private:
  130.         // Encapsulates the MIDIHDR structure for MIDI output
  131.         class CMIDIOutHeader
  132.         {
  133.         public:
  134.             CMIDIOutHeader(HMIDIOUT DevHandle, LPSTR Msg, 
  135.                            DWORD MsgLength);
  136.             ~CMIDIOutHeader();
  137.             void SendMsg();
  138.         private:
  139.             HMIDIOUT m_DevHandle;
  140.             MIDIHDR  m_MIDIHdr;
  141.         };
  142.         // Thread safe queue for storing CMIDIOutHeader objects
  143.         class CHeaderQueue
  144.         {
  145.         public:
  146.             CHeaderQueue();
  147.             ~CHeaderQueue();
  148.             void AddHeader(CMIDIOutHeader *Header);
  149.             void RemoveHeader();
  150.             void RemoveAll();
  151.             bool IsEmpty();
  152.         private:
  153.             std::queue<CMIDIOutHeader *> m_HdrQueue;
  154.             CRITICAL_SECTION m_CriticalSection;
  155.         };
  156.     // Private attributes and constants
  157.     private:
  158.         HMIDIOUT       m_DevHandle;
  159.         HANDLE         m_Event;
  160.         CWinThread    *m_WorkerThread;
  161.         CHeaderQueue   m_HdrQueue;
  162.         enum State { CLOSED, OPENED } m_State;
  163.     };
  164. }
  165. #endif