📄 audio.c
字号:
#include "pmfplayer.h"
#include <pspaudio.h>
#include <stdio.h>
#include <malloc.h>
#define printf pspDebugScreenPrintf
int T_Audio(SceSize _args, void *_argp)
{
DecoderThreadData* D = *((DecoderThreadData**)_argp);
sceKernelWaitSema(D->Audio->m_SemaphoreStart, 1, 0);
for(;;)
{
printf("in T_Video thread\n");
if(D->Audio->m_iAbort != 0)
break;
if(D->Audio->m_iFullBuffers > 0)
{
sceAudioOutputBlocking(D->Audio->m_AudioChannel, PSP_AUDIO_VOLUME_MAX,
D->Audio->m_pAudioBuffer[D->Audio->m_iPlayBuffer]);
D->Audio->m_iPlayBuffer = (D->Audio->m_iPlayBuffer + 1) % D->Audio->m_iNumBuffers;
sceKernelWaitSema(D->Audio->m_SemaphoreLock, 1, 0);
D->Audio->m_iFullBuffers--;
sceKernelSignalSema(D->Audio->m_SemaphoreLock, 1);
}
else
{
sceKernelDelayThread(1000);
}
}
while(D->Audio->m_iFullBuffers > 0)
{
sceAudioOutputBlocking(D->Audio->m_AudioChannel, PSP_AUDIO_VOLUME_MAX,
D->Audio->m_pAudioBuffer[D->Audio->m_iPlayBuffer]);
D->Audio->m_iPlayBuffer = (D->Audio->m_iPlayBuffer + 1) % D->Audio->m_iNumBuffers;
sceKernelWaitSema(D->Audio->m_SemaphoreLock, 1, 0);
D->Audio->m_iFullBuffers--;
sceKernelSignalSema(D->Audio->m_SemaphoreLock, 1);
}
sceKernelExitThread(0);
return 0;
}
SceInt32 InitAudio(PMFPLAYER_STRUCT *p)
{
int i = 0, fail = 0;
p->Audio.m_AudioChannel = sceAudioChReserve(-1, 512, PSP_AUDIO_FORMAT_STEREO);
if(p->Audio.m_AudioChannel < 0)
{
sprintf(p->m_LastError, "sceAudioChReserve() failed: 0x%08X", (int)p->Audio.m_AudioChannel);
return -1;
}
sceAudioSetChannelDataLen(p->Audio.m_AudioChannel, p->m_MpegAtracOutSize / 4);
p->Audio.m_ThreadID = sceKernelCreateThread("audio_thread", T_Audio, 0x3D, 0x10000, PSP_THREAD_ATTR_USER, NULL);
printf("p->Audio.m_ThreadID:%d\n", p->Audio.m_ThreadID);
if(p->Audio.m_ThreadID < 0)
{
sprintf(p->m_LastError, "sceKernelCreateThread() failed: 0x%08X", (int)p->Audio.m_ThreadID);
goto exit0;
}
p->Audio.m_SemaphoreStart = sceKernelCreateSema("audio_start_sema", 0, 0, 1, NULL);
if(p->Audio.m_SemaphoreStart < 0)
{
sprintf(p->m_LastError, "sceKernelCreateSema() failed: 0x%08X", (int)p->Audio.m_SemaphoreStart);
goto exit1;
}
p->Audio.m_SemaphoreLock = sceKernelCreateSema("audio_lock_sema", 0, 1, 1, NULL);
if(p->Audio.m_SemaphoreLock < 0 )
{
sprintf(p->m_LastError, "sceKernelCreateSema() failed: 0x%08X", (int)p->Audio.m_SemaphoreLock);
goto exit2;
}
p->Audio.m_iNumBuffers = 4;
p->Audio.m_iFullBuffers = 0;
p->Audio.m_iPlayBuffer = 1;
p->Audio.m_iDecodeBuffer = 0;
p->Audio.m_iAbort = 0;
p->Audio.m_LastError = p->m_LastError;
for(i = 0; i < p->Audio.m_iNumBuffers; i++)
{
p->Audio.m_pAudioBuffer[i] = NULL;
p->Audio.m_iBufferTimeStamp[i] = 0;
}
for(i = 0; i < p->Audio.m_iNumBuffers; i++)
{
p->Audio.m_pAudioBuffer[i] = memalign(64, p->m_MpegAtracOutSize);
if(p->Audio.m_pAudioBuffer[i] < 0) fail++;
}
if(fail > 0)
{
for(i = 0; i < p->Audio.m_iNumBuffers; i++)
{
if(p->Audio.m_pAudioBuffer[i] != NULL)
free(p->Audio.m_pAudioBuffer[i]);
}
sprintf(p->m_LastError, "malloc() failed!");
goto exit3;
}
printf("InitAudio ok\n");
return 0;
exit3:
sceKernelDeleteSema(p->Audio.m_SemaphoreLock);
exit2:
sceKernelDeleteSema(p->Audio.m_SemaphoreStart);
exit1:
sceKernelDeleteThread(p->Audio.m_ThreadID);
exit0:
sceAudioChRelease(p->Audio.m_AudioChannel);
return -1;
}
SceInt32 ShutdownAudio(PMFPLAYER_STRUCT *p)
{
int i;
sceKernelDeleteThread(p->Audio.m_ThreadID);
sceKernelDeleteSema(p->Audio.m_SemaphoreStart);
sceKernelDeleteSema(p->Audio.m_SemaphoreLock);
for(i = 0; i < p->Audio.m_iNumBuffers; i++)
free(p->Audio.m_pAudioBuffer[i]);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -