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

📄 reader.c

📁 psp下pmf文件播放器源码
💻 C
字号:
#include "pmfplayer.h"
#include <stdio.h>

#define printf pspDebugScreenPrintf

int T_Reader(SceSize _args, void *_argp)
{
	ReaderThreadData* D = *((ReaderThreadData**)_argp);

	SceInt32 iTotalBytes	= 0;
	SceInt32 iFreePackets	= 0;
	SceInt32 iReadPackets	= 0;
	SceInt32 iPackets		= 0;
	
	for(;;)
	{
		printf("in T_Reader thread\n");
		iPackets = 0;

		if(D->m_Status == READER_ABORT)
			break;

		iFreePackets = sceMpegRingbufferAvailableSize(D->m_Ringbuffer);

		if(iFreePackets > 0)
		{
			iReadPackets = iFreePackets;

			if(iTotalBytes < D->m_StreamSize)
			{
				if( iReadPackets > 32 )
					iReadPackets = 32;

				int iPacketsLeft = (D->m_StreamSize - iTotalBytes) / 2048;

				if( iPacketsLeft < iReadPackets )
					iReadPackets = iPacketsLeft;

				iPackets = sceMpegRingbufferPut(D->m_Ringbuffer, iReadPackets, iFreePackets);
				if(iPackets < 0)
				{
					sprintf(D->m_LastError, "sceMpegRingbufferPut() failed: 0x%08X", (int)iPackets);
					D->m_Status = READER_ABORT;
					break;
				}
			}
		}

		sceKernelSignalSema(D->m_Semaphore, 1);

		if(iPackets > 0) iTotalBytes += iPackets * 2048;

		if(iTotalBytes >= D->m_StreamSize && D->m_Status != READER_ABORT)
		{
			D->m_Status = READER_EOF;
		}
	}

	sceKernelSignalSema(D->m_Semaphore, 1);

	sceKernelExitThread(0);

	return 0;
}

SceInt32 InitReader(PMFPLAYER_STRUCT *p)
{
	p->Reader.m_ThreadID = sceKernelCreateThread("reader_thread", T_Reader, 0x41, 0x10000, PSP_THREAD_ATTR_USER, NULL);
	printf("p->Reader.m_ThreadID:%d\n", p->Reader.m_ThreadID);
	if(p->Reader.m_ThreadID	< 0)
	{
		return -1;
	}
	
	p->Reader.m_Semaphore = sceKernelCreateSema("reader_sema", 0, 0, 1, NULL);
	if(p->Reader.m_Semaphore < 0)
	{
		sceKernelDeleteSema(p->Reader.m_Semaphore);
		return -1;
	}
	
	p->Reader.m_StreamSize			= p->m_MpegStreamSize;
	p->Reader.m_Ringbuffer			= &p->m_Ringbuffer;
	p->Reader.m_RingbufferPackets	= p->m_RingbufferPackets;
	p->Reader.m_Status				= 0;
	p->Reader.m_LastError			= p->m_LastError;
	
	printf("InitReader ok\n");

	return 0;

}

SceInt32 ShutdownReader(PMFPLAYER_STRUCT *p)
{
	sceKernelDeleteThread(p->Reader.m_ThreadID);

	sceKernelDeleteSema(p->Reader.m_Semaphore);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -