C++ 在Ubuntu12.04 64位中,使用sdl_混音器生成音调时存在分段错误
我必须在大学写一个简单的sinthesizer,它使用sdl_混频器来产生正弦波。我从我的老师那里得到了一个在windows上正常工作的代码,但在ubuntu中它存在分段错误。 我安装了sdl_mixer1.2-dev和sdl1.2-dev软件包。 我尝试了一个用sdl_音频生成音调的代码。它工作得很好,但我听说对于多通道播放,sdl_混音器是解决方案。 代码的getch()部分工作正常,问题在于声音管理器部分 有人能帮我解决这个问题吗 这是我的密码:C++ 在Ubuntu12.04 64位中,使用sdl_混音器生成音调时存在分段错误,c++,ubuntu,ubuntu-12.04,sdl-mixer,C++,Ubuntu,Ubuntu 12.04,Sdl Mixer,我必须在大学写一个简单的sinthesizer,它使用sdl_混频器来产生正弦波。我从我的老师那里得到了一个在windows上正常工作的代码,但在ubuntu中它存在分段错误。 我安装了sdl_mixer1.2-dev和sdl1.2-dev软件包。 我尝试了一个用sdl_音频生成音调的代码。它工作得很好,但我听说对于多通道播放,sdl_混音器是解决方案。 代码的getch()部分工作正常,问题在于声音管理器部分 有人能帮我解决这个问题吗 这是我的密码: #include <iostream
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
班级音响管理员
{
int channelnum;
向量块;
公众:
void init()
{
如果(Mix_OpenAudio(48000,AUDIO_S16,2,1024)=-1)
{
分配的cerr=1;
ownsample->volume=体积;
int playchannel=Mix_playchannel(-1,ownsample,0);
if(playchannel!=-1&&chunks[playchannel])
{
删除[]块[playchannel]->abuf;
Mix_FreeChunk(chunks[播放频道]);
}
如果(播放频道!=-1)
chunks[playchannel]=ownsample;
}
};
混合块*ownsample=0;
混合块*samples=0;
空挂()
{
如果(Mix_OpenAudio(48000,AUDIO_S16,2,1024)=-1)
{
分配的cerr=0;
ownsample->volume=128;
cout alen(1)如果出现分段错误,是否可以使用调试符号重新编译代码(如果使用的是g++或clang++);使用-g3
(2) 使用调试器运行程序并获取代码分段错误所在的堆栈跟踪(使用gdb)。这看起来绝对是假的:
void play_stereo(const vector<short int>& v, int volume=128)
{
const short int *p = &(v[0]);
//...
ownsample->abuf = (Uint8*)p;
//...
delete[] chunks[playchannel]->abuf;
哇,这真是一团糟。你可以尝试清楚地格式化代码,然后告诉我们你把分段错误追到了哪里(例如,上面的调用或指针取消引用实际上触发了错误)。此外,如果您在调试程序(如GDB)中运行了此功能,请向我们说明您在解释所看到的内容时遇到的困难。您的意思是在论坛中或发布之前格式化代码?我没有使用代码格式化,因为我看不到屏幕上显示的内容,所以以前不需要。如果我在此处发布调试信息,可以吗与valgrind确认?我明白你在说什么。代码完全错误。可能是论坛重新格式化了它。我会问一位朋友谁可以纠正这个错误。一旦你格式化了代码以便我们可以阅读,也会告诉我们你在缩小错误方面取得了多大进展。(例如,哪些函数错误,它的参数是什么,等等)如果你能从示例中删除代码,但仍然失败,那就更好了。你可以查看一些提示,了解如何将代码缩减为一个小的、自包含的示例。
// short int * p = new short int[v.size()];
// for (size_t i=0;i<v.size();i++) {
// p[i]=v[i];
// }