288 lines
5.6 KiB
C++
288 lines
5.6 KiB
C++
/*
|
|
** thinlib (c) 2001 Matthew Conte (matt@conte.com)
|
|
**
|
|
**
|
|
** This program is free software; you can redistribute it and/or
|
|
** modify it under the terms of version 2 of the GNU Library General
|
|
** Public License as published by the Free Software Foundation.
|
|
**
|
|
** This program 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
|
|
** Library General Public License for more details. To obtain a
|
|
** copy of the GNU Library General Public License, write to the Free
|
|
** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
**
|
|
** Any permitted reproduction of these routines, in whole or in part,
|
|
** must bear this legend.
|
|
**
|
|
**
|
|
** thintest.cpp
|
|
**
|
|
** thinlib test
|
|
** $Id: thintest.cpp,v 1.3 2001/03/12 06:06:55 matt Exp $
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include "thinlib.h"
|
|
|
|
//#define TEST_STEREO
|
|
#define TEST_DPP
|
|
|
|
class test
|
|
{
|
|
public:
|
|
test();
|
|
~test();
|
|
void run();
|
|
|
|
private:
|
|
enum
|
|
{
|
|
SAMPLE_RATE = 44100,
|
|
FRAGSIZE = 256,
|
|
VID_WIDTH = 320,
|
|
VID_HEIGHT = 240,
|
|
VID_BPP = 8
|
|
};
|
|
|
|
int testSound();
|
|
int testVideo();
|
|
int testTimer();
|
|
int testEvents();
|
|
};
|
|
|
|
test::test()
|
|
{
|
|
int ret = thin_init(THIN_KEY | THIN_MOUSE | THIN_TIMER
|
|
| THIN_VIDEO | THIN_SOUND);
|
|
THIN_ASSERT(-1 != ret);
|
|
}
|
|
|
|
test::~test()
|
|
{
|
|
thin_shutdown();
|
|
}
|
|
|
|
static void fillbuf(void *user_data, void *buf, int size)
|
|
{
|
|
static int pos = 0;
|
|
UNUSED(user_data);
|
|
|
|
while (size--)
|
|
{
|
|
*((uint8 *) buf)++ = 127 + (int8)(127.0 * sin(2 * PI * pos / 128));
|
|
#ifdef TEST_STEREO
|
|
*((uint8 *) buf)++ = 127 + (int8)(127.0 * cos(2 * PI * pos / 128));
|
|
#endif
|
|
pos = (pos + 1) & 1023;
|
|
}
|
|
}
|
|
|
|
int test::testSound()
|
|
{
|
|
thinsound_t params;
|
|
|
|
params.sample_rate = SAMPLE_RATE;
|
|
params.frag_size = FRAGSIZE;
|
|
#ifdef TEST_STEREO
|
|
params.format = THIN_SOUND_STEREO | THIN_SOUND_8BIT;
|
|
#else
|
|
params.format = THIN_SOUND_MONO | THIN_SOUND_8BIT;
|
|
#endif
|
|
params.callback = fillbuf;
|
|
params.user_data = NULL;
|
|
|
|
if (thin_sound_init(¶ms))
|
|
return -1;
|
|
|
|
thin_sound_start();
|
|
thin_sound_stop();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int test::testVideo()
|
|
{
|
|
int i, x, y;
|
|
bitmap_t *screen;
|
|
bitmap_t *buffer;
|
|
|
|
/* set up video */
|
|
if (thin_vid_init(VID_WIDTH, VID_HEIGHT, VID_BPP, 0/*THIN_VIDEO_HWSURFACE*/))
|
|
return -1;
|
|
|
|
buffer = thin_bmp_create(VID_WIDTH, VID_HEIGHT, VID_BPP, 0);
|
|
if (NULL == buffer)
|
|
return -1;
|
|
|
|
/* fill it up with something interesting */
|
|
for (y = 0; y < buffer->height; y++)
|
|
for (x = 0; x < buffer->width; x++)
|
|
buffer->line[y][x] = x ^ y;
|
|
|
|
/* blit it out 1000 times */
|
|
for (i = 0; i < 1000; i++)
|
|
{
|
|
screen = thin_vid_lockwrite();
|
|
if (NULL == screen)
|
|
return -1;
|
|
|
|
for (y = 0; y < screen->height; y++)
|
|
memcpy(screen->line[y], buffer->line[y], screen->width);
|
|
|
|
thin_vid_freewrite(-1, NULL);
|
|
}
|
|
|
|
thin_vid_shutdown();
|
|
|
|
if (1000 != i)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static volatile int timer_ticks = 0;
|
|
static void timer_handler(void *param)
|
|
{
|
|
(void) param;
|
|
timer_ticks++;
|
|
}
|
|
THIN_LOCKED_STATIC_FUNC(timer_handler)
|
|
|
|
int test::testTimer()
|
|
{
|
|
int last_ticks;
|
|
|
|
THIN_LOCK_FUNC(timer_handler);
|
|
THIN_LOCK_VAR(timer_ticks);
|
|
|
|
/* one second intervals... */
|
|
if (thin_timer_init(60, timer_handler, NULL))
|
|
return -1;
|
|
|
|
timer_ticks = last_ticks = 0;
|
|
while (timer_ticks <= 60)
|
|
{
|
|
if (last_ticks != timer_ticks)
|
|
{
|
|
last_ticks = timer_ticks;
|
|
thin_printf("%d 60 hz tick\n", last_ticks);
|
|
}
|
|
}
|
|
|
|
thin_timer_shutdown();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int test::testEvents()
|
|
{
|
|
thin_event_t event;
|
|
bool done = false;
|
|
|
|
thin_mouse_init(80, 20, 1);
|
|
thin_joy_init();
|
|
thin_dpp_init();
|
|
thin_dpp_add(0x378, 0);
|
|
|
|
thin_printf("event test: press ESC...");
|
|
|
|
while (!done)
|
|
{
|
|
thin_event_gather();
|
|
|
|
while (thin_event_get(&event))
|
|
{
|
|
switch (event.type)
|
|
{
|
|
case THIN_KEY_PRESS:
|
|
if (event.data.keysym == THIN_KEY_ESC)
|
|
done = true;
|
|
thin_printf("key press\n");
|
|
break;
|
|
|
|
case THIN_KEY_RELEASE:
|
|
thin_printf("key release\n");
|
|
break;
|
|
|
|
case THIN_MOUSE_MOTION:
|
|
thin_printf("mouse motion\n");
|
|
break;
|
|
|
|
case THIN_MOUSE_BUTTON_PRESS:
|
|
thin_printf("mouse button press\n");
|
|
break;
|
|
|
|
case THIN_MOUSE_BUTTON_RELEASE:
|
|
thin_printf("mouse button release\n");
|
|
break;
|
|
|
|
case THIN_JOY_MOTION:
|
|
thin_printf("joy motion\n");
|
|
break;
|
|
|
|
case THIN_JOY_BUTTON_PRESS:
|
|
thin_printf("joy button press\n");
|
|
break;
|
|
|
|
case THIN_JOY_BUTTON_RELEASE:
|
|
thin_printf("joy button release\n");
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
thin_dpp_shutdown();
|
|
thin_joy_shutdown();
|
|
thin_mouse_shutdown();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void test::run()
|
|
{
|
|
if (testSound())
|
|
return;
|
|
|
|
if (testVideo())
|
|
return;
|
|
|
|
if (testTimer())
|
|
return;
|
|
|
|
if (testEvents())
|
|
return;
|
|
|
|
thin_printf("\ntest complete.\n");
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
test *pTest = new test;
|
|
|
|
pTest->run();
|
|
|
|
delete pTest;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
** $Log: thintest.cpp,v $
|
|
** Revision 1.3 2001/03/12 06:06:55 matt
|
|
** better keyboard driver, support for bit depths other than 8bpp
|
|
**
|
|
** Revision 1.2 2001/02/01 06:28:26 matt
|
|
** thinlib now works under NT/2000
|
|
**
|
|
** Revision 1.1 2001/01/15 05:27:43 matt
|
|
** initial revision
|
|
**
|
|
*/
|