编程实现一个电子音乐相册。具体功能要求: 利用文件IO知识获取music目录下的所有mp3文件名和picture目录下所有bmp、jpg、jpeg文件名,把获取到的文件名作为数据域存入链表(链表类型自选); 显示出功能选择界面:音乐播放、图片浏览; 音乐播放功能: (1)支持播放mp3格式音乐; (2)通过触摸屏点击,支持上一曲、下一曲、播放、暂停、结束播放、返回功能选择界面; (3)音乐播放期间,可以返回功能选择界面,进入图片浏览界面。 图片浏览功能: (1)支持显示bmp、jpg、jpeg格式图片; (2)支持自动播放模式、手动浏览模式切换;自动播放每隔3S换下一幅图;手动浏览通过触摸屏点击,实现上一幅、下一幅切换;5S没有点击上一幅或下一幅,自动切换到自动播放模式; (3)有返回按钮,能否返回功能选择界面。
时间: 2023-12-23 22:06:13 浏览: 166
遍历目录下所有的文件_遍历文件夹文件_java遍历目录下所有文件_
这是一个比较复杂的项目,需要涉及到文件IO、音频播放、图片显示等多个方面的知识。以下是我实现电子音乐相册的代码,其中链表类型我选择使用了双向链表:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <linux/fb.h>
#include <linux/vt.h>
#include <linux/kd.h>
#define MUSIC_DIR_PATH "/home/root/music/"
#define PICTURE_DIR_PATH "/home/root/picture/"
#define MP3_EXTENSION ".mp3"
#define BMP_EXTENSION ".bmp"
#define JPG_EXTENSION ".jpg"
#define JPEG_EXTENSION ".jpeg"
#define MAX_FILENAME_LEN 256
#define FUNC_CHOICE_MUSIC 1
#define FUNC_CHOICE_PICTURE 2
#define PLAY_MODE_MANUAL 0
#define PLAY_MODE_AUTO 1
typedef struct file_node {
char filename[MAX_FILENAME_LEN];
struct file_node *prev;
struct file_node *next;
} FileNode;
FileNode *music_list_head = NULL, *music_list_tail = NULL;
FileNode *picture_list_head = NULL, *picture_list_tail = NULL;
int fb_fd, fd_ts, fd_sound;
unsigned int *fb_mem;
struct fb_var_screeninfo vinfo;
struct input_event ts_event;
int sound_rate = 44100;
int sound_channels = 2;
int sound_bits = 16;
int sound_buf_size;
char *sound_buf;
int open_fb() {
fb_fd = open("/dev/fb0", O_RDWR);
if (fb_fd < 0) {
printf("Error opening framebuffer device: %m.\n");
return -1;
}
if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) != 0) {
printf("Error reading variable screen info: %m.\n");
return -1;
}
fb_mem = mmap(NULL, vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);
if (fb_mem == MAP_FAILED) {
printf("Error mapping framebuffer memory: %m.\n");
return -1;
}
return 0;
}
void close_fb() {
munmap(fb_mem, vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8);
close(fb_fd);
}
int open_ts() {
fd_ts = open("/dev/input/event0", O_RDONLY);
if (fd_ts < 0) {
printf("Error opening touchscreen device: %m.\n");
return -1;
}
return 0;
}
void close_ts() {
close(fd_ts);
}
void get_ts_event() {
read(fd_ts, &ts_event, sizeof(ts_event));
}
int open_sound() {
fd_sound = open("/dev/dsp", O_WRONLY);
if (fd_sound < 0) {
printf("Error opening sound device: %m.\n");
return -1;
}
int format = AFMT_S16_NE;
int channels = sound_channels == 1 ? 0 : 1;
int ioctl_result;
ioctl_result = ioctl(fd_sound, SNDCTL_DSP_SETFMT, &format);
ioctl_result = ioctl(fd_sound,
阅读全文