使用 GTK 和 c++ 播放音频文件

2023-12-30

我目前正在使用 gtk+ 和 C++ 代码构建一个非常简单的音乐播放器,但现在我无法弄清楚如何使用 C++ 代码打开和播放音频文件。

#include <gtk/gtk.h>
// simple music player to practice gtk and c++//

int main(int argc, char* argv[])
{
gtk_init(&argc,&argv);

GtkWidget *window;
GtkWidget *playButton;
GtkWidget *fileButton;
GtkWidget *frame;
GtkWidget *Dialog;


window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);

frame = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), frame);

playButton = gtk_button_new_with_label("Play");
gtk_widget_set_size_request(playButton,80,40);
gtk_fixed_put(GTK_FIXED(frame),playButton,40,330);

fileButton = gtk_button_new_with_label("Open");
gtk_widget_set_size_request(fileButton,80,40);
gtk_fixed_put(GTK_FIXED(frame),fileButton,40,260);

gtk_widget_show_all(window);
gtk_main();

return 0;
}

如您所见,我创建了打开按钮来选择您的文件,并且我知道对话框代码;

GtkWidget *dialog;

dialog = gtk_file_chooser_dialog_new ("OpenFile",parent_window,GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);

if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
  {
    char *filename;

    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
    open_file (filename);
   g_free (filename);
 }

gtk_widget_destroy (dialog);

但我的问题是我不知道如何放置代码,我很可能应该创建一个函数并在单击打开按钮时设置对该函数的回调。正确的?然后第二个问题是,无论我如何努力搜索,我似乎都找不到如何播放音频文件,非常感谢!


如果您不介意使用外部库Allegro http://alleg.sourceforge.net/使播放各种格式的音频文件变得异常容易。以下是如何播放 .wav 音频文件的示例。

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>

int main(int argc, char **argv){

   ALLEGRO_DISPLAY *display = NULL;
   ALLEGRO_SAMPLE *sample=NULL;

   if(!al_init()){
      fprintf(stderr, "failed to initialize allegro!\n");
      return -1;
   }

   if(!al_install_audio()){
      fprintf(stderr, "failed to initialize audio!\n");
      return -1;
   }

   if(!al_init_acodec_addon()){
      fprintf(stderr, "failed to initialize audio codecs!\n");
      return -1;
   }

   if (!al_reserve_samples(1)){
      fprintf(stderr, "failed to reserve samples!\n");
      return -1;
   }

   sample = al_load_sample( "footstep.wav" );

   if (!sample){
      printf( "Audio clip sample not loaded!\n" ); 
      return -1;
   }

   display = al_create_display(640, 480);

   if(!display){
      fprintf(stderr, "failed to create display!\n");
      return -1;
   }

   /* Loop the sample until the display closes. */
   al_play_sample(sample, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_LOOP,NULL);

   al_rest(10.0);

   al_destroy_display(display);
   al_destroy_sample(sample);
   return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GTK 和 c++ 播放音频文件 的相关文章

随机推荐

  • Mongoid 限制删除多个

    使用mongoid 如何删除前10000个文档error message字段是 Error not found 原生 mongo 查询将被愉快地接受 MongoDB 支持删除限制 删除命令从集合中删除文档 单个 删除命令可以包含多个删除规范
  • System.StackOverflowException WPF MVVM

    我正在尝试使用 MVVM 在 WPF 中创建一个简单的数字时钟 我有一个带有装订的标签 背后的代码很简单 每秒都会引发一个属性更改事件 并且我有一个 stackoverflow 异常 有人可以帮忙吗 public partial class
  • 如何调用 script 标签中定义的 javascript 函数?

    Example 我该怎么打电话test 编辑 我没有正确解释这一点 我正在使用node js的request模块来加载包含javascript函数的外部html文件 request get options function error re
  • 在 vim 中映射 Shift 键

    I m having an issue when mapping the Shift key in VIM I want Ctrl L to behave differently than Ctrl Shift L 所以我有这个 for i
  • 数据流管道和 pubsub 模拟器

    我正在尝试设置我的开发环境 我没有在生产中使用 google cloud pubsub 而是使用 pubsub 模拟器进行开发和测试 为了实现这一点 我设置了以下环境变量 export PUBSUB EMULATOR HOST localh
  • 蓝牙配对时未调用 BroadcastReceiver

    很简单 我唯一的代码是这样的 final BroadcastReceiver mReceiver new BroadcastReceiver Override public void onReceive Context context In
  • Python 集合.counter

    python新手 想知道如何告诉python第3行中的数据都是一个数字而不是单个数字 我正在使用 collections Counter 但它可能不是正确的 datafile csv Z4 29 Mar 13 Name 1 1234567
  • 使用 R markdown、knitr、pandoc、beamer 绘图大小和分辨率

    默认情况下不适合幻灯片 甚至不通过任何其他方式打印 这是 Rmd 编辑 看来你必须在每个块中使用plot 现在打印第二个图 Plot should show at high resolution r echo FALSE comment l
  • 如何在 php 中获取部分从 jquery 加载的页面的整个 html

    我这问题好几天了 我必须从 php 加载页面的整个 html 在此页面上有一个 jquery 函数 当所有页面加载完毕时会调用该函数 这个函数将其他html加载到页面中 所以我必须加载所有html 也加载了jquery的部分 我可以知道我得
  • 如何检测软键盘输入法是否覆盖整个屏幕?

    我正在创建一个应用程序 用户可以在其中单击选项卡 并且将以编程方式显示软键盘 但是 如果软键盘要覆盖整个屏幕 如提取的 EditText 我不想显示软键盘 如下所示 检测屏幕方向可能会有所帮助 但据我所知 在平板电脑上 即使在横向上 软键盘
  • 获取主干集合中属性不等于某个值的所有模型

    这取自 Backbone js 文档 var musketeers friends where job Musketeer 在那里你可以获得一系列工作平等的模型 那就是 火枪手 但我该如何做相反的事情呢 我怎样才能获得一系列工作不是 火枪手
  • 如何从 ListView 控件中的各个项目中删除复选框?

    我有一个 ListView 其中包含 名称 预期 总计 列 我想在末尾添加另一列 重新计数 理想情况下 仅当 预期 值大于 总计 值时 重新计数 列才会有一个复选框 到目前为止 我已经获得了带有列的 ListView 并且可以在左侧添加一个
  • Android 中的简单 XML 解析

    我的xml如下所示 lt sUID gt yPkmfG3caT6cxexj5oWy34WiUUjj8WliWit45IzFVSOt6gymAOUA lt sUID gt lt Shipping gt 0 00 lt Shipping gt
  • 使用 Angular cli 6 项目在 Chrome 工作区中处理组件 CSS 文件

    我正在尝试在 Angular 6 7 CLI 项目中使用具有 CSS 持久编辑功能的 Google Chrome 工作区 当在 angular json 配置中添加 extractCSS true 并使用 source map true 标
  • 检测点击外部元素?

    如同这个问题 https stackoverflow com questions 152975 how to detect a click outside an element 但更进一步 我想检测一组项目之外的点击 我按以下方式处理这些项
  • jQuery(或者可能是浏览器)是破坏缓存的ajax加载脚本

    我正在通过加载视图页面 ajax 使用 jQuery 调用 我明确将 缓存 选项设置为 true 我们在应用程序中没有任何地方使用 ajaxSetup 否则指定 这是 ajax 请求设置 viewDialogLink click funct
  • Chart.js - 如何在图表中间添加文本?

    我正在使用 Chart js 创建此折线图 但我需要标记区域 如下所示 有任何想法吗 您扩展您使用的图表 然后使用辅助方法编写标签 HTML
  • 如何转义 fopen 的 url

    看起来 fopen 无法打开带有空格的文件 例如 url http gatewaypeople com images articles cntrbutnssttmnts12 main 616x200 jpg fopen url r 返回 f
  • Jenkins作业运行系统Groovy脚本如何响应用户kill

    我有一个长时间运行的 System Groovy 脚本 它启动了数以万计的其他构建 为了不使构建队列过长 导致 UI 无法使用 它监视构建队列的长度 如果构建队列长于给定阈值 它将不会启动任何新构建并休眠一分钟 问题是 该脚本不响应用户终止
  • 使用 GTK 和 c++ 播放音频文件

    我目前正在使用 gtk 和 C 代码构建一个非常简单的音乐播放器 但现在我无法弄清楚如何使用 C 代码打开和播放音频文件 include