bool CSoundManager::PlayWave3D(int x, int y, int Freq, int Nr) { int vol, pan; float xdiff, ydiff, Abstand; xdiff = ((pPlayer[0]->xpos + 45) - x); ydiff = ((pPlayer[0]->ypos + 45) - y); Abstand = float(sqrt((xdiff * xdiff) + (ydiff * ydiff))); vol = int(100-float(Abstand/6.0f)); if (vol < 0) vol = 0; else { // Sound links oder rechts vom Spieler ? if (x < pPlayer[0]->xpos + 45) { pan = 128 - (100 - vol); if (pan < 0) pan = 0; } else { pan = 128 + (100 - vol); if (pan > 255) pan = 255; } PlayWave(vol, pan, Freq, Nr); } return true; } // PlaySound
void CSoundManager::FadeWave(int Nr, int Mode) { // Sound soll eingefadet werden? if (Mode == FADEMODE_IN) { // Fadet gerade garnicht? Dann abspielen if (its_Sounds[Nr]->FadeMode == FADEMODE_NON) PlayWave(1, 128, 11025, Nr); } // Sound soll ausgefadet werden? else if (Mode == FADEMODE_OUT) { } its_Sounds[Nr]->FadeMode = Mode; } // FadeWave
//刷新显示线程 void *RenderAudio(void *arg) { if(!arg) return NULL; AvManager *manager = (AvManager*)arg; MediaPacket spkt; long avsize = 0; int ret = 0; //只有在没有停止信号下,才能不断地读取数据 for(;manager->avState != STOP;) { //如果是暂停且没有快进时,才可以不断等待 if(manager->avState == PAUSE && !manager->avSeek) { usSleep(DEFAULT_AV_WAIT); continue; } ret = RecvDataFromAvQueue(manager->MediaAudio,&spkt); if(ret < 0) { usSleep(DEFAULT_AV_WAIT); continue; } if(manager->avSeek && !IsHardWareAccel()) { FlushBuffers(AUDIO); DestroyPacket(&spkt); continue; } if(manager->audioDelay) { usSleep(manager->audioDelay); manager->audioDelay = 0; } if(spkt.data && spkt.size > 0) { void *abuf = DecodeAudioStream(&spkt,&avsize); //播放音乐 if(abuf && avsize > 0) { PlayWave(abuf,avsize); //声音时间戳部分 manager->audioClock = (double)avsize/(double)manager->audioBasePara; if(spkt.pts != AV_NOPTS_VALUE) manager->playerClock = AVTimeToSecond(spkt.pts,manager->audioTimeBase) + manager->audioClock; else manager->playerClock += manager->audioClock; manager->last_audio_pts = manager->playerClock; } } else FreeAlloc(spkt.data); } return NULL; }
//=================================================* // ------------------------ Play Selected Alarm File //===================================================* BOOL PlayFile(HWND hwnd, const char* fname, DWORD dwLoops) { char file[MAX_PATH]; if(!fname[0] || fname[0]=='<') return FALSE; if(fname[0]!='/' && fname[0]!='\\' && fname[1]!=':' // no abs path &&(fname[0]!='.' || (fname[1]!='/' && fname[1]!='\\' && (fname[1]!='.' || (fname[2]!='/' && fname[2]!='\\'))))) // no relative path (strict relative) { // do it relative to "waves/" char app[MAX_PATH]; const size_t tlen=api.root_len; const size_t len=strlen(fname)+1; // incl. terminating null if(len<MAX_PATH-tlen-7){ memcpy(file, api.root, tlen); // absolute path is at least required by .pcb / PlayNoSoundThread (not for .wav) memcpy(file+tlen, "\\waves\\", 7); memcpy(file+tlen+7, fname, len); if(api.GetFileAndOption(file, app, NULL) == 0){ fname = file; } } } if(ext_cmp(fname, "wav") == 0) { if(m_bMCIPlaying) return FALSE; return PlayWave(hwnd, fname, dwLoops); } if(ext_cmp(fname, "pcb") == 0) { if(m_bMCIPlaying) return FALSE; PlayNoSoundThread(hwnd, fname, dwLoops); return TRUE; } else if(IsMMFile(fname)) { char command[MIN_BUFF+MAX_PATH]; if(m_bMCIPlaying) return FALSE; strcpy(command, "open \""); strcat(command, fname); strcat(command, "\" alias myfile"); if(mciSendString(command, NULL, 0, NULL) == 0) { strcpy(command, "set myfile time format "); if(strcasecmp(fname, "cdaudio") == 0 || ext_cmp(fname, "cda") == 0) { strcat(command, "tmsf"); m_bTrack = TRUE; } else { strcat(command, "milliseconds"); m_bTrack = FALSE; } mciSendString(command, NULL, 0, NULL); m_nTrack = -1; if(ext_cmp(fname, "cda") == 0) { const char* p; p = fname; m_nTrack = 0; while(*p) { if('0' <= *p && *p <= '9') m_nTrack = m_nTrack * 10 + *p - '0'; p++; } } if(PlayMCI(hwnd, m_nTrack) == 0) { m_bMCIPlaying = TRUE; m_countPlay = dwLoops; } else mciSendString("close myfile", NULL, 0, NULL); } return m_bMCIPlaying; } else api.ExecFile(fname,hwnd); return FALSE; }