blob: 1cd9ed22e389379e9967ebd62ad7c2324f475c7e [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media.midi;
/**
* This class contains utilities for socket communication between a
* MidiInputPort and MidiOutputPort
*/
/* package */ class MidiPortImpl {
private static final String TAG = "MidiPort";
/**
* Packet type for data packet
*/
public static final int PACKET_TYPE_DATA = 1;
/**
* Packet type for flush packet
*/
public static final int PACKET_TYPE_FLUSH = 2;
/**
* Maximum size of a packet that can be passed between processes.
*/
public static final int MAX_PACKET_SIZE = 1024;
/**
* size of message timestamp in bytes
*/
private static final int TIMESTAMP_SIZE = 8;
/**
* Data packet overhead is timestamp size plus packet type byte
*/
private static final int DATA_PACKET_OVERHEAD = TIMESTAMP_SIZE + 1;
/**
* Maximum amount of MIDI data that can be included in a packet
*/
public static final int MAX_PACKET_DATA_SIZE = MAX_PACKET_SIZE - DATA_PACKET_OVERHEAD;
/**
* Utility function for packing MIDI data to be passed between processes
*
* message byte array contains variable length MIDI message.
* messageSize is size of variable length MIDI message
* timestamp is message timestamp to pack
* dest is buffer to pack into
* returns size of packed message
*/
public static int packData(byte[] message, int offset, int size, long timestamp,
byte[] dest) {
if (size > MAX_PACKET_DATA_SIZE) {
size = MAX_PACKET_DATA_SIZE;
}
int length = 0;
// packet type goes first
dest[length++] = PACKET_TYPE_DATA;
// data goes next
System.arraycopy(message, offset, dest, length, size);
length += size;
// followed by timestamp
for (int i = 0; i < TIMESTAMP_SIZE; i++) {
dest[length++] = (byte)timestamp;
timestamp >>= 8;
}
return length;
}
/**
* Utility function for packing a flush command to be passed between processes
*/
public static int packFlush(byte[] dest) {
dest[0] = PACKET_TYPE_FLUSH;
return 1;
}
/**
* Returns the packet type (PACKET_TYPE_DATA or PACKET_TYPE_FLUSH)
*/
public static int getPacketType(byte[] buffer, int bufferLength) {
return buffer[0];
}
/**
* Utility function for unpacking MIDI data received from other process
* returns the offset of the MIDI message in packed buffer
*/
public static int getDataOffset(byte[] buffer, int bufferLength) {
// data follows packet type byte
return 1;
}
/**
* Utility function for unpacking MIDI data received from other process
* returns size of MIDI data in packed buffer
*/
public static int getDataSize(byte[] buffer, int bufferLength) {
// message length is total buffer length minus size of the timestamp
return bufferLength - DATA_PACKET_OVERHEAD;
}
/**
* Utility function for unpacking MIDI data received from other process
* unpacks timestamp from packed buffer
*/
public static long getPacketTimestamp(byte[] buffer, int bufferLength) {
// timestamp is at end of the packet
int offset = bufferLength;
long timestamp = 0;
for (int i = 0; i < TIMESTAMP_SIZE; i++) {
int b = (int)buffer[--offset] & 0xFF;
timestamp = (timestamp << 8) | b;
}
return timestamp;
}
}