⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio.c

📁 psp下pmf文件播放器源码
💻 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 + -