blob: 92ab8db8d667c78d5e8357b1404b06e53e149d9e [file] [log] [blame]
Stepan Moskovchenko215e4922005-04-15 06:08:55 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
Nils Wallménius0e496052007-09-24 15:57:32 +00008 * $Id$
Stepan Moskovchenko215e4922005-04-15 06:08:55 +00009 *
10 * Copyright (C) 2005 Stepan Moskovchenko
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
Nils Wallménius0e496052007-09-24 15:57:32 +000019#include "plugin.h"
20#include "midiutil.h"
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000021
22extern struct plugin_api * rb;
23
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +000024int chVol[16] IBSS_ATTR; /* Channel volume */
Nils Wallméniuse1940b82007-10-04 19:36:42 +000025int chPan[16] IBSS_ATTR; /* Channel panning */
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +000026int chPat[16] IBSS_ATTR; /* Channel patch */
27int chPW[16] IBSS_ATTR; /* Channel pitch wheel, MSB only */
Stepan Moskovchenkod33645b2007-10-17 03:48:24 +000028int chPBDepth[16] IBSS_ATTR; /* Channel pitch bend depth */
29int chPBNoteOffset[16] IBSS_ATTR; /* Pre-computed whole semitone offset */
30int chPBFractBend[16] IBSS_ATTR; /* Fractional bend applied to delta */
31
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000032
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000033struct GPatch * gusload(char *);
34struct GPatch * patchSet[128];
35struct GPatch * drumSet[128];
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000036
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +000037struct SynthObject voices[MAX_VOICES] IBSS_ATTR;
Stepan Moskovchenko58112142005-04-15 20:27:04 +000038
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000039void *alloc(int size)
40{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000041 static char *offset = NULL;
Michael Sevakis26d242a2007-04-21 18:38:25 +000042 static ssize_t totalSize = 0;
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000043 char *ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000044
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000045 int remainder = size % 4;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000046
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000047 size = size + 4-remainder;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000048
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000049 if (offset == NULL)
50 {
Michael Sevakis8676dc22007-04-21 19:07:15 +000051 offset = rb->plugin_get_audio_buffer((size_t *)&totalSize);
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000052 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000053
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000054 if (size + 4 > totalSize)
55 {
Jens Arnoldb1f00492007-04-21 05:35:17 +000056 printf("MALLOC BARF");
57 printf("MALLOC BARF");
58 printf("MALLOC BARF");
59 printf("MALLOC BARF");
60 printf("MALLOC BARF");
61 printf("MALLOC BARF");
62 printf("MALLOC BARF");
Stepan Moskovchenko47efba82006-05-03 05:18:18 +000063 /* We've made our point. */
64
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000065 return NULL;
66 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000067
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000068 ret = offset + 4;
69 *((unsigned int *)offset) = size;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000070
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000071 offset += size + 4;
72 totalSize -= size + 4;
73 return ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000074}
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000075
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000076/* Rick's code */
Stepan Moskovchenko58112142005-04-15 20:27:04 +000077/*
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000078void *alloc(int size)
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000079{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000080 static char *offset = NULL;
Michael Sevakis26d242a2007-04-21 18:38:25 +000081 static ssize_t totalSize = 0;
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000082 char *ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000083
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000084
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000085 if (offset == NULL)
86 {
Michael Sevakis8676dc22007-04-21 19:07:15 +000087 offset = rb->plugin_get_audio_buffer((size_t *)&totalSize);
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000088 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000089
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000090 if (size + 4 > totalSize)
91 {
92 return NULL;
93 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000094
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000095 ret = offset + 4;
96 *((unsigned int *)offset) = size;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000097
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000098 offset += size + 4;
99 totalSize -= size + 4;
100 return ret;
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +0000101}
102*/
103
104#define malloc(n) my_malloc(n)
105void * my_malloc(int size)
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000106{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000107 return alloc(size);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000108}
109
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000110unsigned char readChar(int file)
111{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000112 char buf[2];
113 rb->read(file, &buf, 1);
114 return buf[0];
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000115}
116
117unsigned char * readData(int file, int len)
118{
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +0000119 unsigned char * dat = malloc(len);
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000120 rb->read(file, dat, len);
121 return dat;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000122}
123
124int eof(int fd)
125{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000126 int curPos = rb->lseek(fd, 0, SEEK_CUR);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000127
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000128 int size = rb->lseek(fd, 0, SEEK_END);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000129
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000130 rb->lseek(fd, curPos, SEEK_SET);
131 return size+1 == rb->lseek(fd, 0, SEEK_CUR);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000132}
133
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +0000134// Here is a hacked up printf command to get the output from the game.
135int printf(const char *fmt, ...)
136{
Stepan Moskovchenko47efba82006-05-03 05:18:18 +0000137 static int p_xtpt = 0;
Stepan Moskovchenkob2f1b5d2006-05-01 23:22:59 +0000138 char p_buf[50];
139 bool ok;
140 va_list ap;
141
142 va_start(ap, fmt);
143 ok = rb->vsnprintf(p_buf,sizeof(p_buf), fmt, ap);
144 va_end(ap);
145
146 rb->lcd_putsxy(1,p_xtpt, (unsigned char *)p_buf);
147 rb->lcd_update();
148
149 p_xtpt+=8;
150 if(p_xtpt>LCD_HEIGHT-8)
151 {
152 p_xtpt=0;
153 rb->lcd_clear_display();
154 }
155 return 1;
156}
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000157
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000158void exit(int code)
159{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000160 code = code; /* Stub function, kill warning for now */
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000161}
Nils Wallménius0e496052007-09-24 15:57:32 +0000162