`
l.yun
  • 浏览: 77133 次
  • 性别: Icon_minigender_1
  • 来自: Guang Xi Nan Ning
社区版块
存档分类
最新评论

D语言播放音乐

    博客分类:
  • blog
阅读更多

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

 

0
0
分享到:
评论

相关推荐

    openwrt用安卓手机控制路由器播放音乐

    OpenWRT 使用安卓手机控制路由器播放音乐 OpenWRT 是一个开源的路由器操作系统,使用 Lua 语言开发,具有高度的定制性和可扩展性。通过 OpenWRT,我们可以将路由器变成一个功能强大的媒体服务器,实现音乐远程播放...

    播放音乐的JAVA应用程序

    标题"播放音乐的JAVA应用程序"暗示了我们将使用Java语言来编写一个音乐播放器。`wav`格式是一种常见的无损音频格式,适用于各种平台,因此在Java程序中处理.wav文件相对简单。在Java中,我们可以通过以下步骤来实现...

    FPGA播放音乐

    在本项目“FPGA播放音乐”中,我们将深入探讨如何使用Verilog语言通过FPGA实现音乐播放功能,特别是播放“友谊地久天长”这首曲目。 Verilog是一种硬件描述语言(HDL),它允许工程师以一种结构化、接近高级编程...

    D3D音频播放

    在这个"D3D音频播放"的例子中,我们将深入探讨如何使用C++编程语言来实现这一功能。 首先,我们需要理解Direct3D音频的基本概念。DirectSound分为两大部分:DirectSound3D(3D音效)和DirectSound8(2D音效)。...

    proteus中8051单片机播放音乐.rar

    2. **程序设计**:使用C语言或汇编语言编写控制8051播放音乐的程序。程序应包括读取音乐数据、解析音乐指令、生成适当的I/O信号等部分。 3. **音乐数据存储**:在Proteus环境中,音乐数据可以存储在外部的EEPROM或...

    汇编语言的课程设计一个键控音乐播放器

    该设计的总体设计方案有两个,一是使用计数器 8253 产生各音符频率,然后使用 8255 并行接口来控制扬声器的开关,达到播放音乐的功能。二是使用数模转换器 0832 来产生频率,原理图是将一个周期的波形分成 32 份,...

    简单音乐播放器java语言

    而`Clip`则是一个可以重复播放的音频片段,适合用于播放音乐。 在Player.java文件中,程序的入口点可能是`main`方法。在这个方法中,开发者首先需要加载音频文件,这通常通过`AudioSystem.getAudioInputStream()`...

    基于FPGA的音乐实现Verilog语言实现

    本项目将探讨如何使用Verilog语言在FPGA上实现音乐播放功能。 Verilog是硬件描述语言(HDL)之一,用于设计数字电路。在本项目中,Verilog代码将被用来创建音乐播放器的核心逻辑。音乐的生成主要依赖于频率控制,...

    用VHDL语言仿真音乐设计

    在“用VHDL语言仿真音乐设计”这一主题中,我们将深入探讨如何利用VHDL来创建一个能够产生音乐的数字系统。这个项目可能涉及到多个模块,每个模块都有特定的功能,共同构成一个完整的音乐合成器。 首先,我们需要...

    单片机播放音乐实例

    单片机音乐播放实例是电子工程领域中一个有趣且实用的应用,主要涉及到微控制器(Microcontroller Unit,简称MCU)的编程与音频处理技术。在这个实例中,我们将深入探讨单片机如何实现音乐播放功能。 首先,单片机...

    用VHDL语言写的音乐播放器

    在这个项目中,开发者利用VHDL语言的能力,创建了一个可以播放音乐的硬件系统,具备切换歌曲(上一首、下一首)的基本功能。 VHDL语言允许设计者以一种结构化和模块化的形式描述数字系统的行为和结构。在音乐播放器...

    Java小试一个播放音乐器

    本项目就是一个很好的例子——“Java小试一个播放音乐器”,它是一个简单的音乐播放程序,专门用于播放wav格式的音频文件。 在Java中实现音乐播放功能,主要涉及到以下几个核心知识点: 1. **音频文件处理**:Java...

    微机原理与汇编语言课程设计

    【微机原理与汇编语言课程设计】是一个实践项目,旨在让学生通过编程和硬件设计实现一个键控音乐播放器。这个项目涵盖了多个知识点,包括: 1. **汇编语言编程**:学生需要用汇编语言编写程序,这涉及到指令集、...

    实战训练32 FPGA播放音乐(一)_FPGA音乐播放_fpga_

    本实战训练的主题是使用FPGA来播放音乐,这是一项既有趣又富有挑战性的任务,它涉及到数字信号处理、音频编码解码以及硬件描述语言(如VHDL或Verilog)编程等多个知识点。 首先,我们需要了解FPGA如何播放音乐。...

    java实现简单的音乐播放器(只可播放wav格式)

    在Java编程语言中,开发一个简单的音乐播放器主要涉及到对音频文件的处理,特别是支持WAV格式的音频。WAV是一种常见的无损音频文件格式,它包含未经压缩的原始音频数据。以下是一些关于如何使用Java实现这个功能的...

    单片机设计的播放音乐实例

    这个实例主要涉及的是如何通过编程控制单片机来播放音乐,适用于课程设计和单片机初学者进行学习。以下将详细介绍这一主题中的关键知识点。 首先,我们需要了解单片机的基本结构和工作原理。单片机是一种集成芯片,...

    单片机课程设计报告利用蜂鸣器播放音乐.doc

    在单片机课程设计中,利用蜂鸣器播放音乐是一项常见的实践项目。这个设计任务旨在让学生掌握单片机的基本操作和音乐播放的原理,通过动手焊接51单片机,实现蜂鸣器的音乐播放功能。在这个过程中,学生不仅能够了解...

    【51单片机C语言+Proteus仿真实例】播放音乐.zip

    这个名为“【51单片机C语言+Proteus仿真实例】播放音乐.zip”的资源包,显然是为帮助学习者理解和实现51单片机通过C语言控制播放音乐的功能而设计的。下面我们将详细探讨其中涉及的知识点。 1. **51单片机**:51...

    基于FPGA的音乐播放模块

    在这个项目中,初学者将学习到如何利用FPGA的并行处理能力来设计一个能够播放音乐的系统。 1. FPGA基础:FPGA是一种可以被重复配置的半导体设备,其内部由大量的可编程逻辑单元组成,如查找表(LUT)、触发器、...

    根据u盘解密密文,在打印letter的同时随机播放音乐

    4. 随机播放音乐:可能使用Java的音频API,如`javax.sound.sampled`包,来加载并播放音乐文件,同时可能加入随机性以使播放不那么机械。 这个项目结合了多种技术,包括文件操作、加密解密、用户交互以及多媒体播放...

Global site tag (gtag.js) - Google Analytics