?? usingsound.html
字號(hào):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Language" content="zh-cn">
<title>使用SDL: 音頻</title>
</head>
<body bgcolor="#FFF8DC" text="#000000">
<TABLE>
<TR><!--#include file="../menu.tmpl" -->
<TD>
<p align="center">
[<a href="usingevents.html">前一頁(yè)</a>]
<a href="toc.html"><font color="#8B0000">目錄</font> </a>
[<a href="usingcdrom.html">后一頁(yè)</a>]
</p>
<h1><font color="#8B0000">使用SDL</font></h1>
<h2>音頻</h2>
<table border="0" cellpadding="4" width="907">
<tr>
<td valign="top" width="582"><ul>
<li><strong>打開(kāi)音頻設(shè)備</strong> </li>
</ul>
<blockquote>
<p>你需要一個(gè)回調(diào)函數(shù)來(lái)混合你的音頻數(shù)據(jù),并放入音頻流。然后,選擇你希望的音頻格式,打開(kāi)音頻設(shè)備。 </p>
<p>直到調(diào)用SDL_PauseAudio(0),音頻回放才真正開(kāi)始;這樣,在你的回調(diào)函數(shù)執(zhí)行前,你可以根據(jù)需要執(zhí)行其他的音頻初始化工作。回放結(jié)束后,調(diào)用SDL_CloseAudio()
關(guān)閉音頻設(shè)備。 </p>
</blockquote>
</td>
<td valign="top" width="299" bgcolor="#D3D3D3"><b>提示:</b><br>
如果你的程序能夠處理不同的音頻格式,把一個(gè)SDL_AudioSpec的指針作為 pointer to
SDL_OpenAudio()
的第二個(gè)參數(shù)可以取得硬件真正的音頻格式。如果第二個(gè)參數(shù)是NULL,音頻數(shù)據(jù)將在運(yùn)行時(shí)被轉(zhuǎn)換成硬件格式。 </td>
</tr>
</table>
<table border="0" cellpadding="50">
<tr>
<td valign="top"><font color="#000080"><strong>例程:</strong></font><pre>
<font color="#0000FF">#include</font> "<font color="#000000">SDL.h</font>"
<font color="#0000FF">#include</font> "<font color="#000000">SDL_audio.h</font>"
{
extern <font color="#008000">void</font> mixaudio(<font
color="#008000">void *</font>unused, <font color="#008000">Uint8 *</font>stream, <font
color="#008000">int</font> len);
SDL_AudioSpec fmt;
<font color="#FF0000">/* 設(shè)置16位,立體聲,22Khz的音頻 */</font>
fmt.freq = 22050;
fmt.format = AUDIO_S16;
fmt.channels = 2;
fmt.samples = 512; <font color="#FF0000">/* 適合游戲的值 */</font>
fmt.callback = mixaudio;
fmt.userdata = NULL;
<font color="#FF0000">/* 打開(kāi)音頻設(shè)備,并開(kāi)始回放! */</font>
<font color="#0000FF">if</font> ( SDL_OpenAudio(&fmt, NULL) < 0 ) {
fprintf(stderr, "<font color="#000000">無(wú)法打開(kāi)音頻: %s\n</font>", SDL_GetError());
exit(1);
}
SDL_PauseAudio(0);
...
SDL_CloseAudio();
}
</pre>
</td>
</tr>
</table>
<table border="0" cellpadding="4" width="907">
<tr>
<td valign="top" width="635"><ul>
<li><strong>加載和回放聲音</strong></li>
</ul>
<blockquote>
<p>為了你的編程方便,SDL提供了單獨(dú)的聲音加載和回放函數(shù)。加載聲音后,需要調(diào)用SDL_ConvertAudio()將其轉(zhuǎn)換成音頻輸出的格式,這樣也可用于你的混音函數(shù)。 </p>
</blockquote>
</td>
<td valign="top" width="246" bgcolor="#D3D3D3"><b>提示:</b><br>
SDL的音頻部分是位底層的軟混音設(shè)計(jì)的。在SDL的演示包里有一個(gè)完整的遵循LGPL許可規(guī)范的混音器實(shí)現(xiàn)例子。. </td>
</tr>
</table>
<table border="0" cellpadding="50">
<tr>
<td valign="top"><font color="#000080"><strong>例程:</strong></font>
<pre>
<font color="#0000FF">#define</font> NUM_SOUNDS 2
<font color="#0000FF">struct</font> sample {
<font color="#008000">Uint8 *</font>data;
<font color="#008000">Uint32</font> dpos;
<font color="#008000">Uint32</font> dlen;
} sounds[NUM_SOUNDS];
<font color="#008000">void</font> mixaudio(<font color="#008000">void *</font>unused, <font
color="#008000">Uint8 *</font>stream, <font color="#008000">int</font> len)
{
<font color="#008000">int</font> i;
<font color="#008000">Uint32</font> amount;
<font color="#0000FF">for</font> ( i=0; i<NUM_SOUNDS; ++i ) {
amount = (sounds[i].dlen-sounds[i].dpos);
<font color="#0000FF">if</font> ( amount > len ) {
amount = len;
}
SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
sounds[i].dpos += amount;
}
}
<font color="#008000">void</font> PlaySound(<font color="#008000">char *</font>file)
{
<font color="#008000">int</font> index;
SDL_AudioSpec wave;
<font color="#008000">Uint8 *</font>data;
<font color="#008000">Uint32</font> dlen;
SDL_AudioCVT cvt;
<font color="#FF0000">/* 尋找一個(gè)空的(或者完成了的)音頻口 */</font>
<font color="#0000FF">for</font> ( index=0; index<NUM_SOUNDS; ++index ) {
<font color="#0000FF">if</font> ( sounds[index].dpos == sounds[index].dlen ) {
break;
}
}
<font color="#0000FF">if</font> ( index == NUM_SOUNDS )
return;
<font color="#FF0000">/* 加載聲音文件,并轉(zhuǎn)換成16位、立體聲、22kHz格式 */</font>
<font color="#0000FF">if</font> ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
fprintf(stderr, "<font color="#000000">無(wú)法加載</font><font color="#000000"> %s: %s\n</font>", file, SDL_GetError());
return;
}
SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
AUDIO_S16, 2, 22050);
cvt.buf = malloc(dlen*cvt.len_mult);
memcpy(cvt.buf, data, dlen);
cvt.len = dlen;
SDL_ConvertAudio(&cvt);
SDL_FreeWAV(data);
<font color="#FF0000">/* 將音頻數(shù)據(jù)放入音頻口(立刻開(kāi)始回放了) */</font>
<font color="#0000FF">if</font> ( sounds[index].data ) {
free(sounds[index].data);
}
SDL_LockAudio();
sounds[index].data = cvt.buf;
sounds[index].dlen = cvt.len_cvt;
sounds[index].dpos = 0;
SDL_UnlockAudio();
}
</pre>
</td>
</tr>
</table>
<p align="center">
[<a href="usingevents.html">前一頁(yè)</a>]
<a href="toc.html"><font color="#8B0000">目錄</font> </a>
[<a href="usingcdrom.html">后一頁(yè)</a>]
</p>
</TABLE>
</body>
</html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -