/* * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #define USE_ERROR //#define USE_TRACE #include "PLATFORM_API_WinOS_Util.h" #if (USE_PLATFORM_MIDI_IN == TRUE) || (USE_PLATFORM_MIDI_OUT == TRUE) /* set the startTime field in MidiDeviceHandle */ void MIDI_SetStartTime(MidiDeviceHandle* handle) { if (handle != NULL) { handle->startTime = (INT64) timeGetTime(); } } /* return time stamp in microseconds */ INT64 MIDI_GetTimeStamp(MidiDeviceHandle* handle) { INT64 res; if (handle == NULL) { return (INT64) -1; } res = ((INT64) timeGetTime()) - handle->startTime; if (res < 0) { res *= (INT64) -1000; } else { res *= (INT64) 1000; } return res; } void* MIDI_CreateLock() { CRITICAL_SECTION* lock = (CRITICAL_SECTION*) malloc(sizeof(CRITICAL_SECTION)); InitializeCriticalSection(lock); TRACE0("MIDI_CreateLock\n"); return lock; } void MIDI_DestroyLock(void* lock) { if (lock) { DeleteCriticalSection((CRITICAL_SECTION*) lock); free(lock); TRACE0("MIDI_DestroyLock\n"); } } void MIDI_Lock(void* lock) { if (lock) { EnterCriticalSection((CRITICAL_SECTION*) lock); } } void MIDI_Unlock(void* lock) { if (lock) { LeaveCriticalSection((CRITICAL_SECTION*) lock); } } int MIDI_WinCreateEmptyLongBufferQueue(MidiDeviceHandle* handle, int count) { return MIDI_WinCreateLongBufferQueue(handle, count, 0, NULL); } int MIDI_WinCreateLongBufferQueue(MidiDeviceHandle* handle, int count, int size, UBYTE* preAllocatedMem) { SysExQueue* sysex; int i; UBYTE* dataPtr; int structSize = sizeof(SysExQueue) + ((count - 1) * sizeof(MIDIHDR)); sysex = (SysExQueue*) malloc(structSize); if (!sysex) return FALSE; memset(sysex, 0, structSize); sysex->count = count; sysex->size = size; // prepare memory block which will contain the actual data if (!preAllocatedMem && size > 0) { preAllocatedMem = (UBYTE*) malloc(count*size); if (!preAllocatedMem) { free(sysex); return FALSE; } sysex->ownsLinearMem = 1; } sysex->linearMem = preAllocatedMem; handle->longBuffers = sysex; // set up headers dataPtr = preAllocatedMem; for (i=0; iheader[i].lpData = dataPtr; sysex->header[i].dwBufferLength = size; // user data is the index of the buffer sysex->header[i].dwUser = (DWORD) i; dataPtr += size; } return TRUE; } void MIDI_WinDestroyLongBufferQueue(MidiDeviceHandle* handle) { SysExQueue* sysex = (SysExQueue*) handle->longBuffers; if (sysex) { handle->longBuffers = NULL; if (sysex->ownsLinearMem && sysex->linearMem) { free(sysex->linearMem); } free(sysex); } } #endif // USE_PLATFORM_MIDI_IN || USE_PLATFORM_MIDI_OUT