游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: hdm2968

请问一个DirectXMusic的问题

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-14 20:40:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

更麻烦的样子,我也有一种办法,把指针做成链表,new前先检查IsPlaying,是就new,不是就把那个指针加载另一个文件,顺便检查多余链表成员,把他们Delete掉。你觉得怎样?

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 21:11:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

嗯!我说的好像和这个差不多,只是把如何“检查多余链表成员”说得更详细了。

“把指针做成链表,new前先检查IsPlaying,是就new,不是就把那个指针加载另一个文件”
我有点不太理解!

我的个人理解,检查IsPlaying可能不行,因为有些音效不一定是循环播放的,比如说鸟叫声,可能是随机播放的,你检测的时候它可能没在播放。还有你如和检测哪些链表成员是多余的啊?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-16 09:20:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

真的很麻烦,你以前做过这样的类吗?

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2005-2-16 14:47:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

我晕,Loader&amperformance与Segment是一对多的关系,你最多需要1个Loader、3个Performance(语音,音效,音乐)和N个Segment

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-16 18:24:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

我只需要音效,Performance一个很难播放多Segment,把DMS改了后音乐有问题,速度慢到晕。

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-16 19:20:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

又看了一下你问的问题,觉得你的问题和我说的好像不是一回事,载入的音效过多确实会影响机器速度(因为吃掉了大量内存),不过造成你的问题的直接原因好像不是这个,是我没有看清问题,理解有偏差,浪费了你的宝贵时间,真不好意思!:)
我想你的问题出在MyMusic类的结构上,你将你的类分成以下两个类来写:
第一个类为 DXSound,包含:
IDirectMusicSegment8* pSegment;
IDirectSound3DBuffer*        pBuffer;
IMultiMediaStream* pMMStream;
IBasicAudio* pBAudio;
IMediaSeeking* pMSeek;
等成员,专门用来保存实际的声音数据,感觉有点像DirectDraw中表面的概念,一个DXSound类对象对应一个音效(也就是一段保存声音数据的内存区域)。
第二个类为DXAudio,也就是音效管理类,包含:
IDirectMusicPerformance8* pPerformance;
IDirectMusicLoader8*        pLoader;
IDirectMusicAudioPath* pAudioPath;
IDirectSound3DListener* pListener;
DS3DLISTENER ListenerParams;
等成员。用于实现:从音频文件中载入音频数据到DXSound类对象中;释放DXSound对象;播放、暂停播放,控制音量等功能。
使用时,应用程序类继承DXAudio类,然后用法如下:
/*定义音频对象*/
DXSound gDS_1;    //第一个音效对象
DXSound gDS_2;    //第二个音效对象
......
/*载入音频*/
LoadAudio( gDS_1, "E:\\y.wav");
LoadAudio( gDS_2, "E:\\midi_01.rmi");

/*播放音频*/
Play( gDS_1 );
Play( gDS_2 );

/*停止播放*/
Stop( gDS_1 );
Stop( gDS_2 );

/*释放音频*/
CloseAudio(gDS_1);
CloseAudio(gDS_2);

LoadAudio()、Play()、Stop()、CloseAudio()等函数为DXAudio类的成员函数。

我想这回应该没有问题了!

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2005-2-17 10:07:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

1\
#include <dmusicc.h>
#include <dmusici.h>
2\
IDirectMusicLoader8*      g_pLoader;
IDirectMusicPerformance8* g_pPerformance;
struct Sound
{
        IDirectMusicSegment8*     g_pSegment;
}soundArrt[10];
3\
//music
        HRESULT        hr = CoInitialize(NULL);
                if (FAILED(hr))
                {
                        return ;
                }
                hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
                     IID_IDirectMusicLoader8, (void**)&g_pLoader );
                hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
                     IID_IDirectMusicPerformance8, (void**)&g_pPerformance );
                hr = g_pPerformance->InitAudio( NULL, NULL, NULL,
                               DMUS_APATH_DYNAMIC_STEREO, 50,
                               DMUS_AUDIOF_ALL, NULL );
                for(int k=0 ;k<9 ;k++)
                {
                        //开始绘制列表
                        if (FAILED(hr))
                        {  
                                ::ExitProcess(0);
                        }
                       
                }
                WCHAR wstrFileName[10][64] = {
                        {L"./SOUND/MUSIC_MOHPA_E3.wav"},
                        {L"./SOUND/Amb_5_1_E3_Airfield_Start.wav"},
                        {L"./SOUND/Amb_5_2_Battle.wav"},
                        {L"./SOUND/Amb_5_2_GrassField.wav"},
                        {L"./SOUND/SOUND_Hitwood_0.wav"},
                        {L"./SOUND/SOUND_Thompson50_RELOAD_0.wav"},
                        {L"./SOUND/SOUND_Thompson_FIRE_0.wav"},
                        {L"./SOUND/SOUND_Thompson_FIRE_1.wav"},
                        {L"./SOUND/SOUND_dryfiremachinegun_1.wav"}
                };
        for(k=0 ;k<9 ;k++)
        {
                        if( FAILED( g_pLoader->LoadObjectFromFile( CLSID_DirectMusicSegment,
                                                                                                   IID_IDirectMusicSegment8,
                                                                                                   wstrFileName[k],
                                                                                                   (LPVOID*) &soundArrt[k].g_pSegment ) ) )
                {
                        MessageBox( NULL, "Media not found",
                                                          "DirectMusic error", MB_OK );
                        g_pPerformance->CloseDown();
                        g_pLoader->Release();
                        g_pPerformance->Release();
                        CoUninitialize();
                        ::ExitProcess (0);
                }
                soundArrt[k].g_pSegment->Download( g_pPerformance );
                soundArrt[k].g_pSegment->SetRepeats( 0 );
        }
        long nVolume = 2000;
        g_pPerformance->SetGlobalParam( GUID_PerfMasterVolume,
                                           (void*)&nVolume, sizeof(long) );
4\
/////
//----------------------------------------------------------------------
//播放音乐
//----------------------------------------------------------------------
void MenuManager:layMusic(int MusicOpern)
{       
        if(MusicOpern >3)return;
        g_pPerformance-&gtlaySegmentEx( soundArrt[MusicOpern].g_pSegment, NULL, NULL, DMUS_SEGF_SECONDARY | DMUS_SEGF_DEFAULT,
                                   0, NULL, NULL, NULL );
}
/////
//----------------------------------------------------------------------
//停止所有音乐
//----------------------------------------------------------------------
void MenuManager::StopMusic( )
{
        for(int k=0 ;k<4 ;k++ )g_pPerformance->Stop( soundArrt[k].g_pSegment, NULL, 0, 0 );
}
/////
//----------------------------------------------------------------------
//播放声音
//----------------------------------------------------------------------
void MenuManager::PlaySoundA (int opernID)
{
        if(opernID >=9 || opernID <4)return;
        g_pPerformance->PlaySegmentEx( soundArrt[opernID].g_pSegment, NULL, NULL, DMUS_SEGF_SECONDARY |DMUS_SEGF_DEFAULT,
                                   0, NULL, NULL, NULL );
}
/////
//----------------------------------------------------------------------
//停止所有声音
//----------------------------------------------------------------------
void MenuManager::StopSound ( )
{
        for(int i=4 ;i<9 ;i++)
        {
                g_pPerformance->Stop( soundArrt.g_pSegment, NULL, 0, 0 );
        }
}

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-2-17 10:25:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

这个可以用一个pool来解决,至于那个地段用将什么音效加入pool中,这个可以offline完成的。让设计师指定就是了。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-17 14:34:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

楼上,何谓pool,有何用?

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2005-2-20 11:26:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

C的书里面有
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 09:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表