import derelict.sdl.sdl;
import derelict.sdl.mixer;
import tango.io.Stdout;
import tango.util.Convert;
import tango.stdc.stringz;
import tango.sys.win32.CodePage;
Mix_Music *music ;
char[][] musics;
int music_index;
bool isplaying = false;
void main() {
Stdout("使用SDL_Mixer 进行音乐播放 支持mp3 ogg...").newline();
Stdout("允许我打印这篇文章的出处 http://lyun.iteye.com").newline();
Stdout("如有建议请发邮件到 liangyun.cn@gmail.com").newline();
Stdout("good luck :)").newline();
Stdout("==================优美的分隔线====================").newline();
init();
scope(exit) cleanup(); // when we exit, perform cleanup
SDL_Surface *screen;
SDL_Event event;
int done = 0;
/* We're going to be requesting certain things from our audio
device, so we set them up beforehand */
int audio_rate = 22050;
Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
int audio_channels = 2;
int audio_buffers = 4096;
/* This is where we open up our audio device. Mix_OpenAudio takes
as its parameters the audio format we'd /like/ to have. */
if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) {
Stdout("Unable to open audio!\n");
}
nextMusic();//马上进行播放下一曲
/* We're going to be using a window onscreen to register keypresses
in. We don't really care what it has in it, since we're not
doing graphics, so we'll just throw something up there. */
screen = SDL_SetVideoMode(320, 240, 0, 0);
while(!done) {
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
done = 1;
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
//按下P键进行播放、暂停切换
if(event.key.keysym.sym==SDLK_p&&event.key.type == SDL_KEYDOWN) {
if(isplaying){
pauseMusic();
}else{
resumeMusic();
}
}
break;
default:
break;
}
}
/* So we don't hog the CPU */
SDL_Delay(50);
}
}
void init() {
//load lib
DerelictSDL.load();
DerelictSDLMixer.load();
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
musics = ["E:\\music\\mp3\\刘德华\\刘德华 - 我恨我痴心.mp3",
"E:\\music\\mp3\\刘德华\\刘德华 - 笨小孩.mp3",
"E:\\music\\mp3\\刘德华\\刘德华 - 孤星泪.mp3"];
music_index = musics.length;
}
void cleanup() {
// tell SDL to quit
SDL_Quit();
// release shared libs
DerelictSDLMixer.unload();
DerelictSDL.unload();
}
void playMusic(char[] file) {
/********注意********/
//SDL_Mixter的字符串的编码是ansi 但是d语言的默认编码是utf8,需要进行转码
//将utf8编码转成ansi 使用tango.sys.win32.CodePage 这里只在win32下有效 linux请使用iconve
//char[] temp = new char[file.length];
//char[] result = CodePage.into(file,temp);
//char * music_path = toStringz(result);
char * music_path = toStringz(CodePage.into(file,new char[file.length]));
/* Here we're going to have the 'm' key toggle the music on and
off. When it's on, it'll be loaded and 'music' will point to
something valid. If it's off, music will be NULL. */
if(music == null) {
/* Actually loads up the music */
//music = Mix_LoadMUS("music.ogg");//可以播放
//music = Mix_LoadMUS("music.mp3");//可以播放
music = Mix_LoadMUS(music_path);
SDL_Delay(100);
if(music == null){
Stdout(" 加载音乐失败! ").newline();
Stdout(" 播放下一首! ").newline();
nextMusic();
}
/* This begins playing the music - the first argument is a
pointer to Mix_Music structure, and the second is how many
times you want it to loop (use -1 for infinite, and 0 to
have it just play once) */
if(Mix_PlayMusic(music, 0)==-1){
Stdout(" 播放音乐失败! ").newline();
Stdout(" 播放下一首! ").newline();
nextMusic();
}
/* We want to know when our music has stopped playing so we
can free it up and set 'music' back to NULL. SDL_Mixer
provides us with a callback routine we can use to do
exactly that */
Mix_HookMusicFinished(&musicDone);
isplaying = true;
}
}
void pauseMusic() {
isplaying = false;
Mix_PauseMusic();
}
void resumeMusic(){
Mix_ResumeMusic();
isplaying =true;
}
void stopMusic(){
if(music != null) {
/* Stop the music from playing */
Mix_HaltMusic();
/* Unload the music from memory, since we don't need it anymore */
Mix_FreeMusic(music);
music = null;
}
}
extern(C) void musicDone() {
stopMusic() ;
Stdout("play finished ").newline();
Stdout("play next").newline();
nextMusic();
}
void nextMusic(){
if(music_index<musics.length-1)
{
music_index = music_index + 1;
Stdout("next music ").newline();
}
else
{
music_index = 0;
Stdout("back fist music ").newline();
}
Stdout("ready music:["~to!(char[])(music_index)~"/"~to!(char[])(musics.length) ~"] "~musics[music_index]).newline();
playMusic(musics[music_index]);
}
//编译环境 dmd1.043 + tango 0.99.7 + dsss 0.75
//D类库 derelict
//C类库 sdl sdl_mixer
发表评论
-
oracle_blob
2007-08-14 09:03 959package test;import java.io.Fil ... -
[转]ShortPath
2007-08-07 08:46 1037<html><head><tit ... -
VC+CSocket文件传送示例
2007-07-12 02:40 2578VC+CSocket文件传送示例2007-01-16 11:1 ... -
[转]oracle数据库的还原和备份
2007-07-12 02:41 913oracle数据库的还原和备份 http://riceworl ... -
IE/FF 兼容
2007-07-11 01:46 1125IE/FF的表单元素获取问题IE: document.getE ... -
获取google卫星图片的t值
2007-07-05 01:45 1149原文 http://intepid.com/2005-07-1 ... -
web 经纬度格式转换工具
2007-07-04 09:30 3887<!--以60进制换算 --><scrīpt ... -
java 经纬度格式转换工具
2007-07-04 10:18 3233package test;import java.text.D ... -
宇宙尽头 爆炸字教程
2007-06-29 03:17 946宇宙尽头 爆炸字教程<P> [attach]15 ... -
nod32
2007-06-27 03:43 1186下载:http://www.lanniao.org/soft/ ... -
down_baidu_map
2007-06-27 04:54 1009很久以前的代码了 import java.io.File; ... -
web鼠标滚轮事件for ie/ff
2007-06-19 03:27 1284滚动鼠标滚轮输出值<scrīpt> var cou ... -
Flex Builder 2以及Charting注册码
2007-06-17 06:49 1476Flex Builder 2以及Charting注册码 Fl ... -
音乐盒类源码
2007-06-13 02:23 1374开始接触actionscrīpt写个音乐盒类包,基本实现歌词显 ... -
javascript request
2007-06-04 00:01 1861var request = { QueryString : ... -
如何在个人空间使用nashihou音乐盒
2007-05-22 10:32 791如何在个人空间... -
“菩提本无树,明镜亦非台,本来无一物,何处惹尘埃?”谁知此禅诗为何意?
2007-05-22 10:35 1322菩提本非树, 明镜亦非台, 本来无一物, 何处染尘埃. 少林六 ... -
web 获取来路网址
2007-05-18 01:38 972<scrīpt type="text/java ... -
baidu mp3
2007-05-16 12:46 694<!DOCTYPE html PUBLIC " ... -
baidu mp3 url
2007-05-15 12:30 955<!DOCTYPE html PUBLIC " ...
相关推荐
OpenWRT 使用安卓手机控制路由器播放音乐 OpenWRT 是一个开源的路由器操作系统,使用 Lua 语言开发,具有高度的定制性和可扩展性。通过 OpenWRT,我们可以将路由器变成一个功能强大的媒体服务器,实现音乐远程播放...
标题"播放音乐的JAVA应用程序"暗示了我们将使用Java语言来编写一个音乐播放器。`wav`格式是一种常见的无损音频格式,适用于各种平台,因此在Java程序中处理.wav文件相对简单。在Java中,我们可以通过以下步骤来实现...
在本项目“FPGA播放音乐”中,我们将深入探讨如何使用Verilog语言通过FPGA实现音乐播放功能,特别是播放“友谊地久天长”这首曲目。 Verilog是一种硬件描述语言(HDL),它允许工程师以一种结构化、接近高级编程...
在这个"D3D音频播放"的例子中,我们将深入探讨如何使用C++编程语言来实现这一功能。 首先,我们需要理解Direct3D音频的基本概念。DirectSound分为两大部分:DirectSound3D(3D音效)和DirectSound8(2D音效)。...
2. **程序设计**:使用C语言或汇编语言编写控制8051播放音乐的程序。程序应包括读取音乐数据、解析音乐指令、生成适当的I/O信号等部分。 3. **音乐数据存储**:在Proteus环境中,音乐数据可以存储在外部的EEPROM或...
该设计的总体设计方案有两个,一是使用计数器 8253 产生各音符频率,然后使用 8255 并行接口来控制扬声器的开关,达到播放音乐的功能。二是使用数模转换器 0832 来产生频率,原理图是将一个周期的波形分成 32 份,...
而`Clip`则是一个可以重复播放的音频片段,适合用于播放音乐。 在Player.java文件中,程序的入口点可能是`main`方法。在这个方法中,开发者首先需要加载音频文件,这通常通过`AudioSystem.getAudioInputStream()`...
本项目将探讨如何使用Verilog语言在FPGA上实现音乐播放功能。 Verilog是硬件描述语言(HDL)之一,用于设计数字电路。在本项目中,Verilog代码将被用来创建音乐播放器的核心逻辑。音乐的生成主要依赖于频率控制,...
在“用VHDL语言仿真音乐设计”这一主题中,我们将深入探讨如何利用VHDL来创建一个能够产生音乐的数字系统。这个项目可能涉及到多个模块,每个模块都有特定的功能,共同构成一个完整的音乐合成器。 首先,我们需要...
单片机音乐播放实例是电子工程领域中一个有趣且实用的应用,主要涉及到微控制器(Microcontroller Unit,简称MCU)的编程与音频处理技术。在这个实例中,我们将深入探讨单片机如何实现音乐播放功能。 首先,单片机...
在这个项目中,开发者利用VHDL语言的能力,创建了一个可以播放音乐的硬件系统,具备切换歌曲(上一首、下一首)的基本功能。 VHDL语言允许设计者以一种结构化和模块化的形式描述数字系统的行为和结构。在音乐播放器...
本项目就是一个很好的例子——“Java小试一个播放音乐器”,它是一个简单的音乐播放程序,专门用于播放wav格式的音频文件。 在Java中实现音乐播放功能,主要涉及到以下几个核心知识点: 1. **音频文件处理**:Java...
【微机原理与汇编语言课程设计】是一个实践项目,旨在让学生通过编程和硬件设计实现一个键控音乐播放器。这个项目涵盖了多个知识点,包括: 1. **汇编语言编程**:学生需要用汇编语言编写程序,这涉及到指令集、...
本实战训练的主题是使用FPGA来播放音乐,这是一项既有趣又富有挑战性的任务,它涉及到数字信号处理、音频编码解码以及硬件描述语言(如VHDL或Verilog)编程等多个知识点。 首先,我们需要了解FPGA如何播放音乐。...
在Java编程语言中,开发一个简单的音乐播放器主要涉及到对音频文件的处理,特别是支持WAV格式的音频。WAV是一种常见的无损音频文件格式,它包含未经压缩的原始音频数据。以下是一些关于如何使用Java实现这个功能的...
这个实例主要涉及的是如何通过编程控制单片机来播放音乐,适用于课程设计和单片机初学者进行学习。以下将详细介绍这一主题中的关键知识点。 首先,我们需要了解单片机的基本结构和工作原理。单片机是一种集成芯片,...
在单片机课程设计中,利用蜂鸣器播放音乐是一项常见的实践项目。这个设计任务旨在让学生掌握单片机的基本操作和音乐播放的原理,通过动手焊接51单片机,实现蜂鸣器的音乐播放功能。在这个过程中,学生不仅能够了解...
这个名为“【51单片机C语言+Proteus仿真实例】播放音乐.zip”的资源包,显然是为帮助学习者理解和实现51单片机通过C语言控制播放音乐的功能而设计的。下面我们将详细探讨其中涉及的知识点。 1. **51单片机**:51...
在这个项目中,初学者将学习到如何利用FPGA的并行处理能力来设计一个能够播放音乐的系统。 1. FPGA基础:FPGA是一种可以被重复配置的半导体设备,其内部由大量的可编程逻辑单元组成,如查找表(LUT)、触发器、...
4. 随机播放音乐:可能使用Java的音频API,如`javax.sound.sampled`包,来加载并播放音乐文件,同时可能加入随机性以使播放不那么机械。 这个项目结合了多种技术,包括文件操作、加密解密、用户交互以及多媒体播放...