WavePlayer::WavePlayer(void) : m_hWaveoutDev(NULL) , m_hThreadPlay(NULL) , m_hThreadDecode(NULL) , m_hEventDecode(NULL) , m_ePlayStat(Play_Stop) , m_pDecoder(NULL) , m_msgDecodeThread(TMSG_CLOSE) , m_msgPlayThread(TMSG_CLOSE) { memset(&m_waveData, 0, sizeof(WaveData)); // 为播放缓存申请内存堆 m_wBlock.pWaveHdr = allocBlocks(BLOCK_SIZE, BLOCK_COUNT); m_wBlock.wfreeblock = BLOCK_COUNT; m_wBlock.wcurrblock = 0; m_wBlock.wpos = 0; m_hEventDecode = CreateEvent(NULL, FALSE, FALSE, NULL); ATLASSERT(m_hEventDecode); m_pDecoder = new AMRDecoder(); ATLASSERT(m_pDecoder); // 初始化临界区 InitializeCriticalSection(&m_cs); }
static bool replaceParentSave(Block* parentSave, int level) { Block replacement; bool success = allocBlocks(level, 1, &replacement); setBlockStatus(replacement, SUBDIV); if(!success) return false; *parentSave = replacement; allocForSub(*parentSave); //have a new (allocated) parent block //set the allocation status of that to subdiv return true; }
void* mmAlloc(size_t size) { /* puts(""); for(int j = 0; j < 60; j++) putchar('*'); puts(""); */ //printf("Allocating %lu bytes\n", size); int parentLevel = 2; //start with smallest block and count up while(blockSize[parentLevel] < size) { parentLevel--; } int level = parentLevel + 1; if(level < 0 || level >= LEVELS) { //puts("WARNING: Couldn't pick a good block size."); level = 0; } size_t bsize = blockSize[level]; int numBlocks = size / bsize; if(size % bsize) numBlocks++; //printf("Allocating a group of %d blocks of level %d\n", numBlocks, level); Block first; bool success = allocBlocks(level, numBlocks, &first); if(success) { //printf("Allocated %lu bytes, block: ", size); //printBlock(first); //puts(""); return getBlockPtr(first); } else { //puts("Allocation failed!"); return NULL; } }