1. 程式人生 > >SDL入門教程(十二):音樂和音效

SDL入門教程(十二):音樂和音效

作者:龍飛

1:擴充套件庫SDL_mixer

        根據網上資料的說法,SDL本身的聲音體系做得不是很完善,好在還有一個比較完善的擴充套件庫SDL_mixer,這個庫支援包括wav, mp3, ogg和midi的聲音和音樂,也算是相當完善了。下載地址在:
http://www.libsdl.org/projects/SDL_mixer/
安裝設定參考前面的涉及SDL擴充套件庫安裝設定的章節。

2:SDL_mixer的啟動和退出,設計MixSoundClass的基類

        這個庫又是通過open...close這樣的格式來初始化啟動以及退出的。但是我們將用到的音樂和音效將分別用到不同的結構體。SDL_mixer中音樂和音效的共同點在於都需要開啟Mix_OpenAudio(),使用完後都應該關閉Mix_CloseAudio()。所以,可以為這兩種類設計共同的基類,並設計一個計數器,作為開啟和關閉的自動開關。

class BaseMixSound
{
private:
    
staticint MixNUM;
protected:
    BaseMixSound();
public:
    
virtual~BaseMixSound();
};

在開啟函式中,也就是這個“假”ABC的建構函式中,我們用到了SDL_mixer的函式:

Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 24096 ) 

其中,第一個引數是頻率,第二個引數是格式,第三個引數是聲道,第四個引數是取樣率。因為我下不到SDL_mixer的說明文件,大概的情況只能描述到這樣。試驗的情況看,這樣的資料是可以比較良好的工作的。
退出的函式是:

Mix_CloseAudio()

我們放在了解構函式中。

3:音效類EffectSound

class EffectSound: public BaseMixSound
{
private:
    Mix_Chunk
* sound;
public:
    EffectSound(
const std::string& sound_fileName);
    
~EffectSound();
    
void play() const;
};

        Mix_Chunk是音效的結構,由函式Mix_LoadWAV()建立,Mix_FreeChunk()釋放。在方法play()中,我們用到了函式:

Mix_PlayChannel(-1, sound, 0

第一個引數是指定播放音效的通道,這裡設定為-1,則系統會自動尋找使用第一個可以使用的通道;第二個引數是要播放的音效的結構指標;第三個是重複次數,這裡為0表示不重複,即播放一次。

4:音樂類MusicSound

class MusicSound: public BaseMixSound
{
private:
    Mix_Music
* music;
public:
    MusicSound(
const std::string& music_fileName);
    
~MusicSound();
    
void play() const;
    
void stop() const;
};

        Mix_Music是音樂的結構,由函式Mix_LoadMUS()建立,Mix_FreeMusic()釋放。我們播放音樂用到的函式為:

Mix_PlayMusic( music, -1 )

第一個引數是要播放的音樂的結構指標;第二個是播放次數,這裡使用-1將不停止的迴圈播放,直到被停止。
另外三個行為的函式為:暫停Mix_PauseMusic(),繼續Mix_ResumeMusic(),結束Mix_HaltMusic()。
還有兩個判斷當前音樂狀態的函式Mix_PlayingMusic()和Mix_PausedMusic(),表示是否在播放,是否暫停了。返回的是int,0為假,1為真。

5:完整的原始碼
http://www.cppblog.com/lf426/archive/2008/04/20/47642.html

相關推薦

SDL入門教程音樂音效

作者:龍飛 1:擴充套件庫SDL_mixer         根據網上資料的說法,SDL本身的聲音體系做得不是很完善,好在還有一個比較完善的擴充套件庫SDL_mixer,這個庫支援包括wav, mp3, ogg和midi的聲音和音樂,也算是相當完善了。下載地址在:http://www.libsdl.org/

Linux小小白入門教程移動/複製命令

以下操作在Linux終端進行。Linux因為許可權非常嚴格,所以暫時所有的命令操作全部是在/home資料夾下的/yangjw資料夾下進行。/yangjw資料夾就是登入使用者名稱所在的資料夾,出了此資料

Linux小小白入門教程使用者使用者組

Linux是一個許可權控制非常嚴格的作業系統。在不瞭解Linux許可權規則前提下,基本對Linux的操作會寸步難行。 簡介 Linux中許可權、使用者、使用者組三者之間關係緊密。要更好的使用Linu

Spring Boot 初級入門教程 —— 執行、測試、打包過程中碰到的各種錯誤

錯誤一:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test-springboot: Compilation fail

機器學習實戰教程線性迴歸提高篇之樂高玩具套件二手價預測

一、前言 本篇文章講解線性迴歸的縮減方法,嶺迴歸以及逐步線性迴歸,同時熟悉sklearn的嶺迴歸使用方法,對樂高玩具套件的二手價格做出預測。 二、嶺迴歸 如果資料的特徵比樣本點還多應該怎麼辦?很顯然,此時我們不能再使用上文的方法進行計算了,因為矩陣X不是滿秩矩陣,非

jmeter教程流程控制終章

這篇博文要介紹的邏輯控制器有:Runtime Controller(執行時間控制器)、吞吐量控制器、模組控制器、While Controller(條件迴圈控制器)、ForEach Controller(遍歷控制器)。 Rumtime Controller,就是用來控制指令碼執行多長時間的。

C++入門教程過載函式

目錄 目錄 基礎示例 基礎講解 在前面程式碼中,int myabs(int num);,可以看到引數是int,返回值也是int,那麼,當傳入浮點型或者長整型時,就會像上面說的引數賦值的步驟進行。換句話說,如果傳入其他int儲存不了

tkinter 庫入門教程放置位置

放置方式1.place() 放置方式2.grid() 放置方式3.place() 原始碼: # 建立主視窗 import tkinter as tk window = tk.Tk() window.title('放置位置') window.geometry

SDL入門教程2、直接通過Unicode讓SDL顯示中文

作者:龍飛2.1:SDL本身可以顯示中文嗎?        SDL的擴充套件庫SDL_ttf本身具備顯示中文的功能嗎?網上很多觀點,說不能顯示的,甚至做了分析解釋了原因。但是,事實是,SDL本身就可以顯示中文。如果我們看看SDL_ttf.c的原始碼,我們可以看到,最終用於構建

Unity Shader入門精要筆記紋理屬性

本系列文章由Aimar_Johnny編寫,歡迎轉載,轉載請標明出處,謝謝。 http://blog.csdn.net/lzhq1982/article/details/75045358 紋理從廣義上講不是一個普通的圖片,我們今後會遇到各種功能性紋理,比如法線紋理,立方體紋

Spring Boot 入門報表匯出,對比poi、jxlesayExcel的效率

本片部落格是緊接著Spring Boot 入門(十一):整合 WebSocket, 實時顯示系統日誌寫的 關於poi、jxl和esayExcel的介紹自行百度。 jxl最多支援03版excel,所以單個sheet頁面最多隻能匯出65536條資料。 我直接將excel匯入到瀏覽器並開啟,以下統計匯出時長指將資

學習MeteoInfo次開發教程

odi 資源 level 無法訪問 .cn oid pub images bsp 1.添加新的Form窗體: 在解決方案資源管理器中,右鍵MeteoInfoDemo,“添加”,“Windows 窗體” 2.新窗體中添加好layersLegend1和Layout之後,要把la

DockerDocker集群管理之Compose

png eas version pull 是否 com a star reat volume 1、Compose安裝   curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-com

Python+Selenium筆記數據驅動測試

name excel表格 assm ddt table clear div 讀取數據 郵箱 (一) 前言 通過使用數據驅動測試,實現對輸入值和預期結果的參數化。(例如:輸入數據和預期結果可以直接讀取Excel文檔的數據) (二) ddt 使用ddt執行數據驅動測試,

Spring Boot教程整合elk1

分享圖片 operation you 運行 hot href iba for 分享 elk 簡介 Elasticsearch是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。

Android項目實戰解決OOM的一種偷懶又有效的辦法

建議 是什麽 cat 解決 blog www. android項目 roi acm 原文:Android項目實戰(十二):解決OOM的一種偷懶又有效的辦法在程序的manifest文件的application節點加入android:largeHeap=“true&

Python3學習筆記閉包

ram 類型 trac 就是 不能 ast 兩種 作用 ror 閉包定義: 在一個外函數中定義了一個內函數,內函數裏引用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。 我們先來看一個簡單的函數: def outer(a): b

Spark筆記整理日誌記錄與監控

提交 說明 默認 conf 分布 core view aps 版本 1 Standalone模式下 按照香飄葉子的文檔部署好完全分布式集群後,提交任務到Spark集群中,查看hadoop01:8080,想點擊查看某個已完成應用的歷史情況,出現下面的提示: Event log

DAY66-前端入門-javascript vue02

選中 log 條件 p2p bin true day6 eth spl 一.文本操作指令 采用文本指令後,頁面標簽的內容由vue實例來控制。 1.v-text <!-- 原文本會被msg替換 --> <p v-text=‘msg‘></p>

java基礎學習總結深入理解java內部類

內部類 內部類也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.class和outer$inner.class。所以內部類的名字完全可以和它的外部類名字相同。 內部類分為四