(六)播放暂停、下一曲、上一曲功能实现

数据展示后需要实现播放功能,播放采用的是在后台开启一个service

这里先不写service的内容,只说基本的播放暂停和下一曲上一曲的逻辑

具体实现方式如下:

//播放/暂停
public boolean playstop() {
    if (index != -1) {//判断是不是第一次进入
        //暂停/播放
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            return false;
        } else {
            mediaPlayer.start();
            timer();//开启定时器
            return true;
        }
    } else {
        Toast.makeText(this, "未选中任何歌曲", Toast.LENGTH_SHORT).show();
        return false;
    }
}

/**
 * 上一曲
 * 下一曲
 */
public int playcontrol(int playsong) {
    switch (playsong) {
        case 1:
            if (index != -1) {//判断是不是刚进入
                //上一曲
                while (musicList.get(--index).type == 0) {
                    //到最后一个元素
                    if (index == 0) {
                        index = musicList.size();
                    }
                }
                play();
            } else {
                Toast.makeText(this, "未选中任何歌曲", Toast.LENGTH_SHORT).show();
            }
            break;
        case 3:
            //下一曲
            if (index != -1) {//判断是不是刚进入
                if (index == musicList.size() - 1) {
                    //歌曲是最后一个元素 从第一个元素开始遍历
                    index = 0;
                    while (musicList.get(++index).type == 0) {
                    }
                    play();
                } else {
                    //歌曲不是最后一个元素
                    while (musicList.get(++index).type == 0) {
                        //到最后一个元素
                        if (index == musicList.size() - 1) {
                            index = 0;
                        }
                    }
                    play();
                }
            } else {
                Toast.makeText(this, "未选中任何歌曲", Toast.LENGTH_SHORT).show();
            }
            break;
    }
    return index;
}
/**
 * 歌曲播放完成监听
 *
 * @param mediaPlayer
 */
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    if (index != -1) {
        if (index == musicList.size() - 1) {
            //歌曲是最后一个元素 从第一个元素开始遍历
            index = 0;
            while (musicList.get(++index).type == 1) {
                play();
            }
        } else {
            //歌曲不是最后一个元素
            while (musicList.get(++index).type == 0) {
                //到最后一个元素
                if (index == musicList.size() - 1) {
                    index = 0;
                }
            }
            play();
        }
        //将播放的音乐序号用广播发送
        Intent indexIntent = new Intent("playindex");
        indexIntent.putExtra("musicindex", index);
        localBroadcastManager.sendBroadcast(indexIntent);
    }

}

以下是使用C语言实现音乐播放器的示例代码,包括上一曲、下一曲暂停播放功能。请注意,这只是一个简单的示例,您需要根据实际情况进行修改和完善。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <alsa/asoundlib.h> // 定义音频设备参数 #define CHANNELS 2 #define RATE 44100 #define PERIOD_SIZE 1024 #define BUFFER_SIZE (PERIOD_SIZE * 2 * CHANNELS) // 定义音乐文件路径 char *music_files[] = {"music1.mp3", "music2.mp3", "music3.mp3", NULL}; int current_file = 0; // 定义音频设备句柄和线程 snd_pcm_t *pcm_handle = NULL; pthread_t play_thread; // 定义播放状态和控制锁 int is_playing = 1; pthread_mutex_t play_mutex; // 定义函数原型 void *play_music(void *arg); void play_next(); void play_prev(); void play_pause(); void play_resume(); int main(int argc, char *argv[]) { // 初始化控制锁 pthread_mutex_init(&play_mutex, NULL); // 初始化音频设备 int err = 0; err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0); if (err < 0) { printf("Unable to open PCM device: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca(&hw_params); snd_pcm_hw_params_any(pcm_handle, hw_params); snd_pcm_hw_params_set_access(pcm_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); snd_pcm_hw_params_set_format(pcm_handle, hw_params, SND_PCM_FORMAT_S16_LE); snd_pcm_hw_params_set_channels(pcm_handle, hw_params, CHANNELS); unsigned int rate = RATE; snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &rate, 0); snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, (snd_pcm_uframes_t*)&PERIOD_SIZE, 0); snd_pcm_hw_params(pcm_handle, hw_params); // 创建播放线程 pthread_create(&play_thread, NULL, play_music, NULL); // 等待线程结束 pthread_join(play_thread, NULL); // 关闭音频设备和控制锁 snd_pcm_close(pcm_handle); pthread_mutex_destroy(&play_mutex); return 0; } void *play_music(void *arg) { while (music_files[current_file] != NULL) { // 加载音频文件 FILE *fp = fopen(music_files[current_file], "rb"); if (fp == NULL) { printf("Unable to open file: %s\n", music_files[current_file]); exit(EXIT_FAILURE); } // 初始化音频缓冲 char buffer[BUFFER_SIZE]; size_t count = 0; // 播放音频 while (is_playing && (count = fread(buffer, 1, sizeof(buffer), fp)) > 0) { // 暂停音频 pthread_mutex_lock(&play_mutex); while (!is_playing) { pthread_mutex_unlock(&play_mutex); usleep(100000); pthread_mutex_lock(&play_mutex); } pthread_mutex_unlock(&play_mutex); // 写入音频设备 int err = snd_pcm_writei(pcm_handle, buffer, count / 4); if (err == -EPIPE) { snd_pcm_prepare(pcm_handle); } else if (err < 0) { printf("Write error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } } // 关闭音频文件 fclose(fp); // 播放一曲 if (music_files[current_file + 1] != NULL) { current_file++; } else { current_file = 0; } } return NULL; } void play_next() { // 切换到下一曲 if (music_files[current_file + 1] != NULL) { current_file++; } else { current_file = 0; } } void play_prev() { // 切换到上一曲 if (current_file > 0) { current_file--; } } void play_pause() { // 暂停播放 pthread_mutex_lock(&play_mutex); is_playing = 0; pthread_mutex_unlock(&play_mutex); } void play_resume() { // 恢复播放 pthread_mutex_lock(&play_mutex); is_playing = 1; pthread_mutex_unlock(&play_mutex); } ``` 在上述代码中,我们使用了ALSA库来初始化音频设备,并创建了一个线程来播放音乐文件。同时,我们还定义了上一曲、下一曲暂停播放功能,使用控制锁来实现线程间的同步。请注意,上述代码只是一个示例,您需要根据具体情况进行修改和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值