- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须在大学写一个简单的合成器,它使用 sdl_mixer 来生成正弦波。我从老师那里得到了一个代码,它可以在 Windows 上正常工作,但在 ubuntu 中它会因段错误而退出。
我安装了 sdl_mixer1.2-dev 和 sdl1.2-dev 软件包。
我尝试了一个使用 sdl_audio 生成音调的代码。它工作得很好,但我听说对于多声道播放,sdl_mixer 是解决方案。
代码的 getch() 部分运行良好,问题出在声音管理器部分。
有人可以帮我解决这个问题吗?
这是我的代码:
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include<cmath>
#include <SDL/SDL_mixer.h>
#include<vector>
using namespace std;
class SoundManager
{
int channelnum;
vector<Mix_Chunk*> chunks;
public:
void init()
{
if (Mix_OpenAudio(48000,AUDIO_S16, 2, 1024) == -1)
{
cerr << "audio hiba" << endl;
exit(1);
}
}
SoundManager(int asked_channelnum=64)
{
channelnum = Mix_AllocateChannels(asked_channelnum);
chunks.assign(channelnum, (Mix_Chunk*)0);
}
int get_channelnum() const
{
return channelnum;
}
void play_stereo(const vector<short int>& v, int volume=128)
{
const short int *p = &(v[0]);
// short int * p = new short int[v.size()];
// for (size_t i=0;i<v.size();i++) {
// p[i]=v[i];
// }
Mix_Chunk * ownsample = new Mix_Chunk;
ownsample->alen = v.size()*2;
ownsample->abuf = (Uint8*)p;
ownsample->allocated = 1;
ownsample->volume = volume;
int playchannel = Mix_PlayChannel(-1, ownsample, 0);
if (playchannel != -1 && chunks[playchannel])
{
delete[] chunks[playchannel]->abuf;
Mix_FreeChunk(chunks[playchannel]);
}
if (playchannel != -1)
chunks[playchannel] = ownsample;
}
};
Mix_Chunk *ownsample = 0;
Mix_Chunk *samples = 0;
void hang()
{
if (Mix_OpenAudio(48000,AUDIO_S16, 2, 1024) == -1)
{
cerr << "audio hiba" << endl;
exit(1);
}
vector<short> s(48000*2,0);
for (int i=0; i<s.size()/2; i++)
{
s[i*2] = sin(i/10.0+i*i/10000.0)*32000*(1/sqrt(i/100.0));
s[i*2+1] = sin(i/10.0)*32000*(1/sqrt(i/100.0));
}
samples = Mix_LoadWAV("ding.wav");
ownsample = new Mix_Chunk;
ownsample->alen = s.size()*2;
ownsample->abuf =(unsigned char*) &(s[0]);
ownsample->allocated = 0;
ownsample->volume = 128;
cout << samples->alen << endl;
if (!samples)
{
cerr << "wav 'ding.wav' open error" << endl;
exit(1);
}
int channelnum = Mix_AllocateChannels(64);
if (channelnum != 64)
{
cerr << "warning: not as many channels are reserved as attended"<<endl;
}
if (Mix_PlayChannel(-1, ownsample, 0)==-1 )
{
cerr << "error on play" << endl;
}
// if (Mix_PlayChannel(-1, samples, 0)==-1 ) {
// cerr << "error on play" << endl;
// }
}
void pitty(SoundManager &sm)
{
vector<short> s(48000*2,0);
for (int i=0; i<s.size()/2; i++)
{
s[i*2] = sin(i/10.0+i*i/10000.0)*32000*(1/sqrt(i/100.0));
s[i*2+1] = sin(i/10.0)*32000*(1/sqrt(i/100.0));
}
sm.play_stereo(s);
}
static struct termios old, New;
/* Initialize New terminal i/o settings */
void initTermios(int echo)
{
tcgetattr(0, &old); /* grab old terminal i/o settings */
New = old; /* make New settings same as old settings */
New.c_lflag &= ~ICANON; /* disable buffered i/o */
New.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
tcsetattr(0, TCSANOW, &New); /* use these New terminal i/o settings now */
}
/* Restore old terminal i/o settings */
void resetTermios(void)
{
tcsetattr(0, TCSANOW, &old);
}
/* Read 1 character - echo defines echo mode */
char getch_(int echo)
{
int ch;
initTermios(echo);
ch = getchar();
resetTermios();
return ch;
}
/* Read 1 character without echo */
int getch(void)
{
return getch_(o);
}
/* Read 1 character with echo */
int getche(void)
{
return getch_(1);
}
int main(void)
{
SoundManager sm(16);
sm.init();
vector<short> s(48000*2,0);
for (int i=0; i<s.size()/2; i++)
{
s[i*2] = sin(i/10.0+i*i/10000.0)*32000*(1/sqrt(i/100.0));
s[i*2+1] = sin(i/10.0)*32000*(1/sqrt(i/100.0));
}
int c;
while (1)
{
c = getch();
cout <<"keycode:\n";
cout <<c;
sm.play_stereo(s);
}
return 0;
}
最佳答案
(1) 如果您遇到段错误,您可以重新编译带有调试符号的代码(如果您使用的是 g++ 或 clang++);使用-g3。
(2) 使用调试器运行程序并获取代码段错误所在的堆栈跟踪(使用 gdb)。
关于c++ - 使用 sdl_mixer 生成音调在 ubuntu 12.04 64 位中因段错误而退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314856/
我正在浏览 this tutorial使用 SDL_mixer 在音频上一切正常。 在那之后,我决定通过探索进行实验、玩耍和学习,所以我制作了一个非常相似的程序,有两个声道,让我播放一些视频游戏音乐,
我正在尝试获取一些开源C ++代码以在xcode中进行编译。它使用SDL库。我为OS X安装了downloaded SDL 2.0并安装了它,并且一切正常-但下载的文件似乎并未包含SDL_mixer.
基本信息: 编程语言 - C++ 平台 - Windows 音频格式 - wav 和 mid 我最近完成了一款游戏,并且正在四处寻找将其上传到文件托管站点的最佳方式。我最终决定使用 7zip 的自解压
如果某个点在范围内,我的程序需要停止播放声音,因为我有一个带有函数 run() 的类,它在单独的线程上运行并使用 SDL.hgetPos())) { print
好了,问题来了。我开始学习 SDL,并想为我为学校项目制作的这个“游戏”添加一些音频。音频无法从我的程序中播放,但我阅读和下载的教程代码中包含音频并可以播放。我真的很困惑为什么我的音频无法播放,但我知
我阅读并尝试了该主题的所有其他帖子,但没有任何帮助。当我尝试使用 Mix_PlayChannel() 播放音乐时,我没有收到错误消息,也没有听到任何声音!我现在尝试了几个小时,但没有任何帮助。程序愉快
我想知道 SDL_Mixer 库中是否有跳转到 wav 文件中特定位置的功能。我发现有一个名为 Mix_SetMusicPosition 的函数,但它不适用于 .wav 文件,也不允许您选择 chan
我遇到了一个奇怪的问题。我想在我的游戏中加入声音。这是一个有两个阶段的游戏。角色扮演游戏之一和战斗之一。在角色扮演游戏中,您可以在踩到怪物时发动战斗。在我的代码中,我使用了 3 次 SDL_mixer
嗨,我正在尝试在这里触发多个音乐播放,这里有一些代码。 Mix_Music *mix_list[MUSIC_COUNT] ; //init music with SDL int
我正在尝试获取一些开源 C++ 代码以在 xcode 中进行编译。它使用 SDL 库。我downloaded适用于 OS X 的 SDL 2.0 并安装了它,一切正常 - 但下载的文件似乎不包含文件
我有一个程序可以使用 SDL_mixer 库 ( http://www.libsdl.org/projects/SDL_mixer/ ) 播放一些声音。当我只使用 Mix_OpenAudio 打开与默
我有 4 个声音。我需要播放声音1,当它结束时,自动播放声音2;当声音 2 结束时,自动播放声音 3。声音 3 结束时,播放声音 4....我正在使用 SDL Mixer 2.0,没有 SDL Sou
我在使用 SDL_Mixer 时遇到了问题(我缺乏经验)。 block 和音乐播放得很好(使用 Mix_PlayChannel 和 Mix_PlayMusic),同时播放两个不同的 block 不是问
我正在使用 SDL 和 SDL_mixer 库,在编译时遇到以下错误: .... game.cpp:(.text+0x88f): undefined reference to `Mix_OpenAud
我想写一个简单的控制台音乐播放器,它支持 .mp3 和 .wav 音频格式。使用 SDL_mixer 播放 .wav 文件会降低声音质量,但使用 mp3 文件则不会。当 .wav 文件开始播放时,会发
我使用 SDL2_Mixer 在 Linux Ubuntu 16.04 上播放声音。 这是我的类(class)代码。 bool SoundPlayer::init() { if (SDL_In
我正在使用 SDL_Mixer 在我的 C++ 游戏中实现声音,但在 the manual 中找不到函数那会给我当前正在播放的 Mix_Music。我想我需要它来了解我是否可以释放 Mix_Music
目前SDL_Mixer有两种声音资源:chunk和music。 除了 API 和支持的格式限制外,是否有任何理由不将音乐作为 SDL_Chunk 和 channel 加载和播放? (内存、速度等) 最
我正在制作一个简单的游戏,当玩家接近正在玩的关卡结束时,它的音频速度应该会增加。所以现在我想知道是否有办法使用 SDL_Mixer 来做到这一点。如果 SDL_Mixer 不是要走的路,请告诉我如何在
我有一个使用 GLFW 进行窗口创建和输入的游戏。是否可以在没有 SDL 的情况下将 SDL_mixer 用于音频? 最佳答案 不,你不能。 因为它依赖于 SDL header 。在 SDL_mixe
我是一名优秀的程序员,十分优秀!