-\r
-\r
-static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;\r
-\r
-void gp2x_start_sound(int rate, int bits, int stereo)\r
-{\r
- int frag = 0, bsize, buffers;\r
-\r
- // if no settings change, we don't need to do anything\r
- if (rate == s_oldrate && s_oldbits == bits && s_oldstereo == stereo) return;\r
-\r
- if (sounddev > 0) close(sounddev);\r
- sounddev = open("/dev/dsp", O_WRONLY|O_ASYNC);\r
- if (sounddev == -1)\r
- printf("open(\"/dev/dsp\") failed with %i\n", errno);\r
-\r
- ioctl(sounddev, SNDCTL_DSP_SETFMT, &bits);\r
- ioctl(sounddev, SNDCTL_DSP_SPEED, &rate);\r
- ioctl(sounddev, SNDCTL_DSP_STEREO, &stereo);\r
- // calculate buffer size\r
- buffers = 16;\r
- bsize = rate / 32;\r
- if (rate > 22050) { bsize*=4; buffers*=2; } // 44k mode seems to be very demanding\r
- while ((bsize>>=1)) frag++;\r
- frag |= buffers<<16; // 16 buffers\r
- ioctl(sounddev, SNDCTL_DSP_SETFRAGMENT, &frag);\r
- usleep(192*1024);\r
-\r
- printf("gp2x_set_sound: %i/%ibit/%s, %i buffers of %i bytes\n",\r
- rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff));\r
-\r
- s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo;\r
-}\r
-\r
-\r
-void gp2x_sound_write(void *buff, int len)\r
-{\r
- write(sounddev, buff, len);\r
-}\r
-\r
-void gp2x_sound_sync(void)\r
-{\r
- ioctl(sounddev, SOUND_PCM_SYNC, 0);\r
-}\r
-\r
-void gp2x_sound_volume(int l, int r)\r
-{\r
- l=l<0?0:l; l=l>255?255:l; r=r<0?0:r; r=r>255?255:r;\r
- l<<=8; l|=r;\r
- ioctl(mixerdev, SOUND_MIXER_WRITE_PCM, &l); /*SOUND_MIXER_WRITE_VOLUME*/\r
-}\r
-\r
-\r
-/* 940 */\r
-void Pause940(int yes)\r
-{\r
- if(yes)\r
- gp2x_memregs[0x0904>>1] &= 0xFFFE;\r
- else\r
- gp2x_memregs[0x0904>>1] |= 1;\r
-}\r
-\r
-\r
-void Reset940(int yes, int bank)\r
-{\r
- gp2x_memregs[0x3B48>>1] = ((yes&1) << 7) | (bank & 0x03);\r
-}\r
-\r
-static void proc_set(const char *path, const char *val)\r
-{\r
- FILE *f;\r
- char tmp[16];\r
-\r
- f = fopen(path, "w");\r
- if (f == NULL) {\r
- printf("failed to open: %s\n", path);\r
- return;\r
- }\r
-\r
- fprintf(f, "0\n");\r
- fclose(f);\r
-\r
- printf("\"%s\" is set to: ", path);\r
- f = fopen(path, "r");\r
- if (f == NULL) {\r
- printf("(open failed)\n");\r
- return;\r
- }\r
-\r
- fgets(tmp, sizeof(tmp), f);\r
- printf("%s", tmp);\r
- fclose(f);\r
-}\r
-\r