Android遊戲之音頻類設計

來源:互聯網
上載者:User

Android遊戲之音頻類設計
Android遊戲之音頻類設計

 

1、基礎知識:


A. setVolumeControlStream(AudioManager.STREAM_MUSIC);
 t)

public final void setVolumeControlStream (int streamType)
Added in API level 1

Suggests an audio stream whose volume should be changed by the hardware volume controls.
The suggested audio stream will be tied to the window of this Activity. Volume requests which are received while the Activity is in the

foreground will affect this stream.
It is not guaranteed that the hardware volume controls will always change this stream's volume (for example, if a call is in progress, its

stream's volume may be changed instead). To reset back to the default, use USE_DEFAULT_STREAM_TYPE.

Parameters

streamType
The type of the audio stream whose volume should be changed by the hardware volume controls.

AudioManager的值:http://developer.android.com/reference/android/media/AudioManager.html
int STREAM_MUSIC The audio stream for music playback

B.getAssets ()
http://developer.android.com/reference/android/content/res/Resources.html#getAssets()
public final AssetManager getAssets ()
Added in API level 1

Retrieve underlying AssetManager storage for these resources.
C.AssetManager
http://developer.android.com/reference/android/content/res/AssetManager.html
D.AssetFileDescriptor
http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
E.SoundPool
http://developer.android.com/reference/android/media/SoundPool.html
The SoundPool class manages and plays audio resources for applications.
A SoundPool is a collection of samples that can be loaded into memory from a resource inside the APK or from a file in the file system. The

SoundPool library uses the MediaPlayer service to decode the audio into a raw 16-bit PCM mono or stereo stream. This allows applications to

ship with compressed streams without having to suffer the CPU load and latency of decompressing during playback.
http://developer.android.com/reference/android/media/SoundPool.html#SoundPool(int, int, int)
Parameters

maxStreams
the maximum number of simultaneous streams for this SoundPool object
streamType
the audio stream type as described in AudioManager For example, game applications will normally use STREAM_MUSIC.
srcQuality
the sample-rate converter quality. Currently has no effect. Use 0 for the default.

Returns
a SoundPool object, or null if creation failed
F.MediaPlayer
http://developer.android.com/reference/android/media/MediaPlayer.html
G.MediaPlayer.OnCompletionListener
http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html


2、設計3個介面Sound,Music,Audio,音頻Audio由聲音Sound和音樂Music構成 
package com.badlogic.androidgames.framework;public interface Sound {    public void play(float volume);    public void dispose();}

package com.badlogic.androidgames.framework;public interface Music {    public void play();    public void stop();    public void pause();    public void setLooping(boolean looping);    public void setVolume(float volume);    public boolean isPlaying();    public boolean isStopped();    public boolean isLooping();    public void dispose();}

package com.badlogic.androidgames.framework;public interface Audio {    public Music newMusic(String filename);    public Sound newSound(String filename);}


3、針對3個介面實現每一個對應的類
package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.content.res.AssetFileDescriptor;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import com.badlogic.androidgames.framework.Music;public class AndroidMusic implements Music, OnCompletionListener {    MediaPlayer mediaPlayer;    boolean isPrepared = false;    public AndroidMusic(AssetFileDescriptor assetDescriptor) {        mediaPlayer = new MediaPlayer();        try {            mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),                    assetDescriptor.getStartOffset(),                    assetDescriptor.getLength());            mediaPlayer.prepare();            isPrepared = true;            mediaPlayer.setOnCompletionListener(this);        } catch (Exception e) {            throw new RuntimeException(Couldn't load music);        }    }    @Override    public void dispose() {        if (mediaPlayer.isPlaying())            mediaPlayer.stop();        mediaPlayer.release();    }    @Override    public boolean isLooping() {        return mediaPlayer.isLooping();    }    @Override    public boolean isPlaying() {        return mediaPlayer.isPlaying();    }    @Override    public boolean isStopped() {        return !isPrepared;    }    @Override    public void pause() {        if (mediaPlayer.isPlaying())            mediaPlayer.pause();    }    @Override    public void play() {        if (mediaPlayer.isPlaying())            return;        try {            synchronized (this) {                if (!isPrepared)                    mediaPlayer.prepare();                mediaPlayer.start();            }        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void setLooping(boolean isLooping) {        mediaPlayer.setLooping(isLooping);    }    @Override    public void setVolume(float volume) {        mediaPlayer.setVolume(volume, volume);    }    @Override    public void stop() {        mediaPlayer.stop();        synchronized (this) {            isPrepared = false;        }    }    @Override    public void onCompletion(MediaPlayer arg0) {        synchronized (this) {            isPrepared = false;        }    }}

 

package com.badlogic.androidgames.framework.impl;import android.media.SoundPool;import com.badlogic.androidgames.framework.Sound;public class AndroidSound implements Sound {    int soundId;    SoundPool soundPool;        public AndroidSound(SoundPool soundPool,int soundId) {        this.soundId = soundId;        this.soundPool = soundPool;    }    @Override    public void play(float volume) {        soundPool.play(soundId, volume, volume, 0, 0, 1);    }    @Override    public void dispose() {        soundPool.unload(soundId);    }}

 

package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.app.Activity;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.AudioManager;import android.media.SoundPool;import com.badlogic.androidgames.framework.Audio;import com.badlogic.androidgames.framework.Music;import com.badlogic.androidgames.framework.Sound;public class AndroidAudio implements Audio {    AssetManager assets;    SoundPool soundPool;    public AndroidAudio(Activity activity) {        activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);        this.assets = activity.getAssets();        this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);    }    @Override    public Music newMusic(String filename) {        try {            AssetFileDescriptor assetDescriptor = assets.openFd(filename);            return new AndroidMusic(assetDescriptor);        } catch (IOException e) {            throw new RuntimeException(Couldn't load music ' + filename + ');        }    }    @Override    public Sound newSound(String filename) {        try {            AssetFileDescriptor assetDescriptor = assets.openFd(filename);            int soundId = soundPool.load(assetDescriptor, 0);            return new AndroidSound(soundPool, soundId);        } catch (IOException e) {            throw new RuntimeException(Couldn't load sound ' + filename + ');        }    }   }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.