mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-27 02:20:05 +00:00
221 lines
8.8 KiB
C++
221 lines
8.8 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2016 - ROLI Ltd.
|
|
|
|
Permission is granted to use this software under the terms of the ISC license
|
|
http://www.isc.org/downloads/software-support-policy/isc-license/
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
|
|
TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
|
|
OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
|
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
OF THIS SOFTWARE.
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
To release a closed-source product which uses other parts of JUCE not
|
|
licensed under the ISC terms, commercial licenses are available: visit
|
|
www.juce.com for more information.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
|
|
/**
|
|
Represents an individual BLOCKS device.
|
|
*/
|
|
class Block : public juce::ReferenceCountedObject
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
/** Destructor. */
|
|
virtual ~Block();
|
|
|
|
/** The different block types.
|
|
|
|
@see Block::getType()
|
|
*/
|
|
enum Type
|
|
{
|
|
unknown = 0,
|
|
lightPadBlock,
|
|
liveBlock,
|
|
loopBlock,
|
|
developerControlBlock,
|
|
seaboardBlock // on-screen seaboard view
|
|
};
|
|
|
|
/** The Block class is reference-counted, so always use a Block::Ptr when
|
|
you are keeping references to them.
|
|
*/
|
|
using Ptr = juce::ReferenceCountedObjectPtr<Block>;
|
|
|
|
/** The Block class is reference-counted, so Block::Array is useful when
|
|
you are storing lists of them.
|
|
*/
|
|
using Array = juce::ReferenceCountedArray<Block>;
|
|
|
|
/** The Block's serial number. */
|
|
const juce::String serialNumber;
|
|
|
|
using UID = uint64;
|
|
|
|
/** This Block's UID.
|
|
|
|
This will be globally unique, and remains constant for a particular device.
|
|
*/
|
|
const UID uid;
|
|
|
|
//==============================================================================
|
|
/** Returns the type of this device.
|
|
|
|
@see Block::Type
|
|
*/
|
|
virtual Type getType() const = 0;
|
|
|
|
/** Returns a human-readable description of this device type. */
|
|
virtual juce::String getDeviceDescription() const = 0;
|
|
|
|
/** Returns the battery level in the range 0.0 to 1.0. */
|
|
virtual float getBatteryLevel() const = 0;
|
|
|
|
/** Returns true if the battery is charging. */
|
|
virtual bool isBatteryCharging() const = 0;
|
|
|
|
//==============================================================================
|
|
/** Returns true if this block is connected and active. */
|
|
virtual bool isConnected() const = 0;
|
|
|
|
/** Returns true if this block is directly connected to the application,
|
|
as opposed to only being connected to a different block via a connection port.
|
|
|
|
@see ConnectionPort
|
|
*/
|
|
virtual bool isMasterBlock() const = 0;
|
|
|
|
//==============================================================================
|
|
/** Returns the width of the device in logical device units. */
|
|
virtual int getWidth() const = 0;
|
|
|
|
/** Returns the height of the device in logical device units. */
|
|
virtual int getHeight() const = 0;
|
|
|
|
/** Returns true if the device is a physical hardware block (i.e. not a virtual block). */
|
|
virtual bool isHardwareBlock() const = 0;
|
|
|
|
/** Returns the length of one logical device unit as physical millimeters. */
|
|
virtual float getMillimetersPerUnit() const = 0;
|
|
|
|
//==============================================================================
|
|
/** If this block has a grid of LEDs, this will return an object to control it.
|
|
Note that the pointer that is returned belongs to this object, and the caller must
|
|
neither delete it or use it after the lifetime of this Block object has finished.
|
|
If there are no LEDs, then this method will return nullptr.
|
|
*/
|
|
virtual LEDGrid* getLEDGrid() const = 0;
|
|
|
|
/** If this block has a row of LEDs, this will return an object to control it.
|
|
Note that the pointer that is returned belongs to this object, and the caller must
|
|
neither delete it or use it after the lifetime of this Block object has finished.
|
|
If there are no LEDs, then this method will return nullptr.
|
|
*/
|
|
virtual LEDRow* getLEDRow() const = 0;
|
|
|
|
/** If this block has any status LEDs, this will return an array of objects to control them.
|
|
Note that the objects in the array belong to this Block object, and the caller must
|
|
neither delete them or use them after the lifetime of this Block object has finished.
|
|
*/
|
|
virtual juce::Array<StatusLight*> getStatusLights() const = 0;
|
|
|
|
/** If this block has a pressure-sensitive surface, this will return an object to
|
|
access its data.
|
|
Note that the pointer returned does is owned by this object, and the caller must
|
|
neither delete it or use it after the lifetime of this Block object has finished.
|
|
If the device is not touch-sensitive, then this method will return nullptr.
|
|
*/
|
|
virtual TouchSurface* getTouchSurface() const = 0;
|
|
|
|
/** If this block has any control buttons, this will return an array of objects to control them.
|
|
Note that the objects in the array belong to this Block object, and the caller must
|
|
neither delete them or use them after the lifetime of this Block object has finished.
|
|
*/
|
|
virtual juce::Array<ControlButton*> getButtons() const = 0;
|
|
|
|
//==============================================================================
|
|
/** This returns true if the block supports generating graphics by drawing into a JUCE
|
|
Graphics context. This should only be true for virtual on-screen blocks; hardware
|
|
blocks will instead use the LED Grid for visuals.
|
|
*/
|
|
virtual bool supportsGraphics() const = 0;
|
|
|
|
//==============================================================================
|
|
/** These are the edge-connectors that a device may have. */
|
|
struct ConnectionPort
|
|
{
|
|
enum class DeviceEdge
|
|
{
|
|
north,
|
|
south,
|
|
east,
|
|
west
|
|
};
|
|
|
|
/** The side of the device on which this port is located. */
|
|
DeviceEdge edge;
|
|
|
|
/** The index of this port along the device edge.
|
|
For north and south edges, index 0 is the left-most port.
|
|
For east and west edges, index 0 is the top-most port.
|
|
*/
|
|
int index;
|
|
|
|
bool operator== (const ConnectionPort&) const noexcept;
|
|
bool operator!= (const ConnectionPort&) const noexcept;
|
|
};
|
|
|
|
/** Returns a list of the connectors that this device has. */
|
|
virtual juce::Array<ConnectionPort> getPorts() const = 0;
|
|
|
|
//==============================================================================
|
|
/** Interface for objects listening to input data port. */
|
|
struct DataInputPortListener
|
|
{
|
|
virtual ~DataInputPortListener() {}
|
|
|
|
/** Called whenever a message from a block is received. */
|
|
virtual void handleIncomingDataPortMessage (Block& source, const void* messageData, size_t messageSize) = 0;
|
|
};
|
|
|
|
/** Adds a new listener of data input port. */
|
|
virtual void addDataInputPortListener (DataInputPortListener*);
|
|
|
|
/** Removes a listener of data input port. */
|
|
virtual void removeDataInputPortListener (DataInputPortListener*);
|
|
|
|
/** Sends a message to the block. */
|
|
virtual void sendMessage (const void* messageData, size_t messageSize) = 0;
|
|
|
|
//==============================================================================
|
|
/** This type is used for timestamping events. It represents a number of milliseconds since the block
|
|
device was booted.
|
|
*/
|
|
using Timestamp = uint32;
|
|
|
|
protected:
|
|
//==============================================================================
|
|
Block (const juce::String& serialNumberToUse);
|
|
|
|
juce::ListenerList<DataInputPortListener> dataInputPortListeners;
|
|
|
|
private:
|
|
//==============================================================================
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Block)
|
|
};
|