Ага. Вот оно как...
Но тогда вот что смущает:
2) передается туда частота дискретизации. 44.1К, 20.05К и тп.
|
Тогда я не понимаю, почему вот такая вот программа воспроизводит на нормальной скорости test.wav с параметрами 44100x16, даже если я укажу int pspsample=PSP_AUDIO_SAMPLE_ALIGN(11050);
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspaudiolib.h>
#include <pspaudio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//----------------------------------------------------------------------------------------
PSP_MODULE_INFO("Sound", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
void dump_threadstatus(void);
bool done=false;
int exit_callback(int arg1,int arg2,void *common)
{
done=true;
return(0);
}
void audio_callback(void* buf,unsigned int length,void *userdata)
{
/*
sample_t* ubuf=(sample_t*)buf;
for(unsigned int n=0;n<length;n++)
{
ubuf[n].r=255*(n%2);
ubuf[n].l=255*((int)(n/2));
}
*/
}
int CallbackThread(SceSize args, void *argp)
{
int cbid;
cbid=sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return(0);
}
int SetupCallbacks(void)
{
int thid = 0;
thid=sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid>=0) sceKernelStartThread(thid, 0, 0);
return(thid);
}
//----------------------------------------------------------------------------------------
//начинаем программу
int main(int argc, char **argv)
{
int n;
int argv_len=strlen(argv[0]);
//формируем имя файла уровня
//отматываем до черты
for(n=argv_len;n>0;n--)
{
if (argv[0][n-1]=='/')
{
argv[0][n]=0;//обрубаем строку
break;
}
}
//устанавливаем обработчики
SetupCallbacks();
pspAudioInit();
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
SceCtrlData pad;
//получаем канал и устанавливаем его параметры
int pspsample=PSP_AUDIO_SAMPLE_ALIGN(11050);
int channel=sceAudioChReserve(PSP_AUDIO_NEXT_CHANNEL,pspsample,PSP_AUDIO_FORMAT_MONO);
if (channel>0)
{
unsigned char *Sound=(unsigned char*)memalign(64,1024*1024*2);
char string[255];
unsigned char *ptr=Sound;
sprintf(string,"%stest.wav",argv[0]);
FILE *file=fopen(string,"rb");
int length=0;
while(1)
{
unsigned char b;
if (fread(&b,1,1,file)<=0) break;
*ptr=b;
ptr++;
length++;
}
fclose(file);
int offset=44;
unsigned char *SampleBuffer=(unsigned char*)malloc(16384);
while(done==false)
{
sceCtrlReadBufferPositive(&pad,1);
if (pad.Buttons&PSP_CTRL_TRIANGLE) break;
while(offset<length)
{
sceCtrlReadBufferPositive(&pad,1);
if (pad.Buttons&PSP_CTRL_TRIANGLE) break;
int sample=16384;
if (length<=offset+sample) sample=length-offset;
sceAudioSetChannelDataLen(channel,sample/2);
memcpy(SampleBuffer,Sound+offset,sample);
sceAudioOutputBlocking(channel,PSP_AUDIO_VOLUME_MAX,SampleBuffer);
offset+=sample;
}
}
free(SampleBuffer);
free(Sound);
sceAudioChRelease(channel);
}
//pspAudioSetChannelCallback(0,audio_callback,NULL);
pspAudioEnd();
//выходим из программы
sceKernelExitGame();
return(0);
}
Как такое может быть, если меняется частота дискретизации?
блок выдавать ровный и не из кэша.
|
В смысле, не из кэша? А как выдавать из кэша?