summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/rbsound.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2006-01-20 13:05:52 +0000
committerDaniel Stenberg <daniel@haxx.se>2006-01-20 13:05:52 +0000
commit137fb6cb9f0478303610443b95ae0a106f0a17d1 (patch)
tree9ac6685589536bc7c84962db8398fddf9d2b3154 /apps/plugins/rockboy/rbsound.c
parentc05cd1676f323f1346099f436aaa0212fd18e178 (diff)
downloadrockbox-137fb6cb9f0478303610443b95ae0a106f0a17d1.tar.gz
rockbox-137fb6cb9f0478303610443b95ae0a106f0a17d1.zip
Karl Kurbjun's patch #1407719:
Here's another patch for rockboy that adds automatic frameskip (it's pretty rough as I haven't figured out an accurate timer), fullscreen support on the H300, and a bit of assembly and some IRAM stuff. I'm not sure if I'm doing the IRAM stuff correct though as it doesn't seem to make much of a difference if any. I've also added a statistics option that will show how many frames per second the gameboy is seeing (not what the player is getting) and what the frameskip is at. When you enable stats sometimes you have to go back into the menu and then come out to clear erronous values. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8397 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/rockboy/rbsound.c')
-rw-r--r--apps/plugins/rockboy/rbsound.c113
1 files changed, 73 insertions, 40 deletions
diff --git a/apps/plugins/rockboy/rbsound.c b/apps/plugins/rockboy/rbsound.c
index b68a053f77..3eebea8bef 100644
--- a/apps/plugins/rockboy/rbsound.c
+++ b/apps/plugins/rockboy/rbsound.c
@@ -3,10 +3,18 @@
3#include "pcm.h" 3#include "pcm.h"
4#include "rc.h" 4#include "rc.h"
5 5
6struct pcm pcm; 6//#define ONEBUF // Note: I think the single buffer implementation is more responsive with sound(less lag)
7 // but it creates more choppyness overall to the sound. 2 buffer's don't seem to make
8 // a difference, but 4 buffers is definately noticable
9
10struct pcm pcm IBSS_ATTR;
7 11
8bool sound = 1; 12bool sound = 1;
13#ifdef ONEBUF
14#define N_BUFS 1
15#else
9#define N_BUFS 4 16#define N_BUFS 4
17#endif
10#define BUF_SIZE 1024 18#define BUF_SIZE 1024
11 19
12rcvar_t pcm_exports[] = 20rcvar_t pcm_exports[] =
@@ -16,48 +24,62 @@ rcvar_t pcm_exports[] =
16 24
17#if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) 25#if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR)
18 26
19static int curbuf,gmcurbuf; 27#ifndef ONEBUF
28static short curbuf,gmcurbuf;
29#else
30bool doneplay=0;
31#endif
20 32
21static byte *buf=0; 33static unsigned char *buf=0;
22static short *gmbuf; 34static unsigned short *gmbuf;
23 35
24static bool newly_started; 36static bool newly_started;
25 37
38void get_more(unsigned char** start, long* size)
39{
40#ifdef ONEBUF
41 doneplay=1;
42 *start = (unsigned char*)(gmbuf);
43#else
44 *start = (unsigned char*)(&gmbuf[pcm.len*curbuf]);
45#endif
46 *size = BUF_SIZE*sizeof(short);
47}
48
26void pcm_init(void) 49void pcm_init(void)
27{ 50{
28 if(!sound) return; 51 if(!sound) return;
29 52
30 newly_started = true; 53 newly_started = true;
31 54
32 pcm.hz = 11025; 55 pcm.hz = 11025;
33 pcm.stereo = 1; 56 pcm.stereo = 1;
34 57
35 pcm.len = BUF_SIZE; 58 pcm.len = BUF_SIZE;
36 if(!buf){ 59 if(!buf){
37 buf = my_malloc(pcm.len * N_BUFS); 60 buf = my_malloc(pcm.len * N_BUFS);
38 gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); 61 gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short));
39 pcm.buf = buf; 62 pcm.buf = buf;
40 pcm.pos = 0; 63 pcm.pos = 0;
41 curbuf = gmcurbuf= 0; 64#ifndef ONEBUF
65 curbuf = gmcurbuf= 0;
66#endif
67 memset(gmbuf, 0, pcm.len * N_BUFS *sizeof(short));
68 memset(buf, 0, pcm.len * N_BUFS);
42 } 69 }
43 70
44 rb->pcm_play_stop(); 71 rb->pcm_play_stop();
45 rb->pcm_set_frequency(11025); // 44100 22050 11025 72
73 rb->pcm_set_frequency(11025); // 44100 22050 11025
46} 74}
47 75
48void pcm_close(void) 76void pcm_close(void)
49{ 77{
50 memset(&pcm, 0, sizeof pcm); 78 memset(&pcm, 0, sizeof pcm);
51 newly_started = true; 79 newly_started = true;
52 rb->pcm_play_stop(); 80 rb->pcm_play_stop();
53 rb->pcm_set_frequency(44100); 81 rb->pcm_set_frequency(44100);
54} 82}
55
56void get_more(unsigned char** start, long* size)
57{
58 *start = (unsigned char*)(&gmbuf[pcm.len*curbuf]);
59 *size = BUF_SIZE*sizeof(short);
60}
61 83
62int pcm_submit(void) 84int pcm_submit(void)
63{ 85{
@@ -66,25 +88,36 @@ int pcm_submit(void)
66 if (!sound) { 88 if (!sound) {
67 pcm.pos = 0; 89 pcm.pos = 0;
68 return 0; 90 return 0;
69 } 91 }
70 92
71 if (pcm.pos >= pcm.len) { 93 if (pcm.pos < pcm.len) return 1;
72 curbuf = (curbuf + 1) % N_BUFS;
73 pcm.buf = buf + pcm.len * curbuf;
74 pcm.pos = 0;
75 94
76 // gotta convert the 8 bit buffer to 16 95#ifndef ONEBUF
77 for(i=0; i<pcm.len;i++) 96 curbuf = (curbuf + 1) % N_BUFS;
78 gmbuf[i+pcm.len*curbuf] = (pcm.buf[i]<<8)-0x8000; 97 pcm.buf = buf + pcm.len * curbuf;
79 } 98#endif
80 99 pcm.pos = 0;
81 if(newly_started) 100
82 { 101 // gotta convert the 8 bit buffer to 16
83 rb->pcm_play_data(&get_more); 102 for(i=0; i<pcm.len;i++)
84 newly_started = false; 103#ifdef ONEBUF
85 } 104 gmbuf[i] = (pcm.buf[i]<<8)-0x8000;
105#else
106 gmbuf[i+pcm.len*curbuf] = (pcm.buf[i]<<8)-0x8000;
107#endif
86 108
87 return 1; 109 if(newly_started)
110 {
111 rb->pcm_play_data(&get_more);
112 newly_started = false;
113 }
114
115 // this while loop and done play are in place to make sure the sound timing is correct(although it's not)
116#ifdef ONEBUF
117 while(doneplay==0) rb->yield();
118 doneplay=0;
119#endif
120 return 1;
88} 121}
89#else 122#else
90static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; // to make sure 4 byte aligned 123static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; // to make sure 4 byte aligned