- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试开始使用 OpenAL。
我正在尝试编译我从 here 获得的这个程序使用:
g++ main.cpp -lOpenAL
此时出现错误"AL/altypes.h"No such file or directory.
。有谁知道我该如何解决这个问题?我已经安装了 libopenal-dev
。 (我认为我在 Ubuntu 13.04 上?)
#include <iostream>
#include <cstdlib>
#include <AL/altypes.h>
#include <AL/al.h>
#include <AL/alu.h>
#include <AL/alut.h>
#define NUM_BUFFERS 1
#define NUM_SOURCES 1
#define NUM_ENVIRONMENTS 1
ALfloat listenerPos[] = {0.0, 0.0, 4.0};
ALfloat listenerVel[] = {0.0, 0.0, 0.0};
ALfloat listenerOri[] = {0.0, 0.0, 1.0, 0.0, 1.0, 0.0};
ALfloat source0Pos[] = {0.0, 0.0, 0.0};
ALfloat source0Vel[] = {0.0, 0.0, 0.0};
ALuint buffer[NUM_BUFFERS];
ALuint source[NUM_SOURCES];
ALuint environment[NUM_ENVIRONMENTS];
ALsizei size, freq;
ALenum format;
ALvoid* data;
void init(void)
{
alListenerfv(AL_POSITION,listenerPos);
alListenerfv(AL_VELOCITY,listenerVel);
alListenerfv(AL_ORIENTATION,listenerOri);
alGetError(); // clear any error messages
// Generate buffers, or else no sound will happen!
alGenBuffers(NUM_BUFFERS, buffer);
if(alGetError() != AL_NO_ERROR)
{
std::cout << "- Error creating buffers !!" << std::endl;
exit(1);
}
else
{
std::cout << "init() - No errors yet." << std::endl;
}
alutLoadWAVFile((Albyte *) "c.wav", &format, &data, size,&freq, &al_bool);
alBufferData(buffer[0],format,data,size,freq);
alutUnloadWAV(format,data,size,freq);
alGetError(); /* clear error */
alGenSources(NUM_SOURCES, source);
if(alGetError() != AL_NO_ERROR)
{
std::cout << "- Error creating sources !!" << std::endl;
exit(2);
}
else
{
std::cout << "init - no errors after alGenSources" << std::endl;
}
alSourcef(source[0], AL_PITCH, 1.0f);
alSourcef(source[0], AL_GAIN, 1.0f);
alSourcefv(source[0], AL_POSITION, source0Pos);
alSourcefv(source[0], AL_VELOCITY, source0Vel);
alSourcei(source[0], AL_BUFFER,buffer[0]);
alSourcei(source[0], AL_LOOPING, AL_TRUE);
}
int main()
{
//initialise openAL
alutInit(&argc, argv) ;
init();
return 0;
}
顺便说一句,这个程序目前实际上不会做我想做的事。
我想声明一个 double/int 数组,用数据填充它并播放该数据。有谁知道我该怎么做?
最佳答案
有一个包含实用程序的包 libalut-dev,但是请查看用于音频文件 I/O 的 libsndfile。推出您自己的 WAV/PCM 解析器始终是一个 chalice ,它可以教给您很多东西,而且并不难。 WRT 你在一边......以下开放代码将数据合成到一个开放缓冲区中,然后将其呈现为音频。下面的另一页代码将为您提供一个流媒体音频播放器,这很方便。编译它使用
gcc -o gen_tone_08 gen_tone_08.c -lopenal -lm
告诉我们你过得怎么样
#include <stdio.h>
#include <stdlib.h> // gives malloc
#include <math.h>
#ifdef __APPLE__
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
#elif __linux
#include <AL/al.h>
#include <AL/alc.h>
#endif
ALCdevice * openal_output_device;
ALCcontext * openal_output_context;
ALuint internal_buffer;
ALuint streaming_source[1];
int al_check_error(const char * given_label) {
ALenum al_error;
al_error = alGetError();
if(AL_NO_ERROR != al_error) {
printf("ERROR - %s (%s)\n", alGetString(al_error), given_label);
return al_error;
}
return 0;
}
void MM_init_al() {
const char * defname = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
openal_output_device = alcOpenDevice(defname);
openal_output_context = alcCreateContext(openal_output_device, NULL);
alcMakeContextCurrent(openal_output_context);
// setup buffer and source
alGenBuffers(1, & internal_buffer);
al_check_error("failed call to alGenBuffers");
}
void MM_exit_al() {
ALenum errorCode = 0;
// Stop the sources
alSourceStopv(1, & streaming_source[0]); // streaming_source
int ii;
for (ii = 0; ii < 1; ++ii) {
alSourcei(streaming_source[ii], AL_BUFFER, 0);
}
// Clean-up
alDeleteSources(1, &streaming_source[0]);
alDeleteBuffers(16, &streaming_source[0]);
errorCode = alGetError();
alcMakeContextCurrent(NULL);
errorCode = alGetError();
alcDestroyContext(openal_output_context);
alcCloseDevice(openal_output_device);
}
void MM_render_one_buffer() {
/* Fill buffer with Sine-Wave */
// float freq = 440.f;
float freq = 100.f;
float incr_freq = 0.1f;
int seconds = 4;
// unsigned sample_rate = 22050;
unsigned sample_rate = 44100;
double my_pi = 3.14159;
size_t buf_size = seconds * sample_rate;
short * samples = malloc(sizeof(short) * buf_size);
printf("\nhere is freq %f\n", freq);
int i=0;
for(; i<buf_size; ++i) {
samples[i] = 32760 * sin( (2.f * my_pi * freq)/sample_rate * i );
freq += incr_freq;
// incr_freq += incr_freq;
// freq *= factor_freq;
if (100.0 > freq || freq > 5000.0) {
incr_freq *= -1.0f;
}
}
/* upload buffer to OpenAL */
alBufferData( internal_buffer, AL_FORMAT_MONO16, samples, buf_size, sample_rate);
al_check_error("populating alBufferData");
free(samples);
/* Set-up sound source and play buffer */
// ALuint src = 0;
// alGenSources(1, &src);
// alSourcei(src, AL_BUFFER, internal_buffer);
alGenSources(1, & streaming_source[0]);
alSourcei(streaming_source[0], AL_BUFFER, internal_buffer);
// alSourcePlay(src);
alSourcePlay(streaming_source[0]);
// ---------------------
ALenum current_playing_state;
alGetSourcei(streaming_source[0], AL_SOURCE_STATE, & current_playing_state);
al_check_error("alGetSourcei AL_SOURCE_STATE");
while (AL_PLAYING == current_playing_state) {
printf("still playing ... so sleep\n");
sleep(1); // should use a thread sleep NOT sleep() for a more responsive finish
alGetSourcei(streaming_source[0], AL_SOURCE_STATE, & current_playing_state);
al_check_error("alGetSourcei AL_SOURCE_STATE");
}
printf("end of playing\n");
/* Dealloc OpenAL */
MM_exit_al();
} // MM_render_one_buffer
int main() {
MM_init_al();
MM_render_one_buffer();
}
关于C++ : AL/altypes. h 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238543/
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
print_string: lodsb ; grab a byte from SI cmp al, 0 ;or al, al ; logical or AL by i
如何用 C 语言编写 test al,al 代码? 我试过 if((n & 0xFF) & 0){} 但这不正确。 谢谢。 最佳答案 我猜你接下来要检查零标志,即 jz 或类似的。在那种情况下你会想要
我在我的 Centos5 机器上运行了这个: ls -al & ; ls -al 我期待它在后台运行 ls -al,同时在前台运行 ls -al,并演示终端的输出是如何被破坏的通过这样做。 但是,我得
ArrayList al = new ArrayList(); 和有什么区别? ArrayList al = new ArrayList(0)? 最佳答案 ArrayList(0) 具有指定初始容量的
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: List versus ArrayList 之间的区别 ArrayList al = new ArrayLi
这是我的代码: section .data digit db 0,10 section .text global _start _start: call _printRAXD
我已经在 XCode 中创建了一个项目并添加了 OpenAL 框架。当我尝试包含 AL/al.h 时,编译器仍然找不到它。 我在哪里添加 OpenAL 的包含目录? 编辑:抱歉我忘了补充:我正在使用
问题陈述:需要从ymm0寄存器中提取位于其值在寄存器AL中的位置的字节。 我的方法:(相当难看): ; Set XMM1 to be a "shift one byte by righ
在调试使用信号量进行跨进程同步的应用程序时,我偶然发现了使用PowerShell代替“其他”进程的想法。在PowerShell中执行以下操作可以正常工作: // In C# application:
我正在尝试为用户显示电影推荐列表。模型已经过训练,但在尝试显示预测时出现错误。 als = ALS(maxIter=5, regParam=0.01, userCol="userID", itemCo
我们在 Azure Spark 上使用 ALS 来构建我们的推荐系统。 由于计算能力的原因,我们无法为每个用户输出不同的推荐列表。因此,我们将用户分为聚类,并使用 ALS 为每个单独的聚类质心输出推荐
我正在阅读一个反汇编的 win32 c++ 程序,我看到了很多: AND AL,0xFF 这是完全没有意义的还是为什么编译器会生成这些? 这是一个更长的例子: movsx eax, byte pt
我对用于推荐引擎的 ALS 有疑问? ALS 是确定性的吗?比如,如果你输入相同的数据和相同的参数,你是否应该总是得到相同的输出(或非常相似的结果)? 最佳答案 简短的回答应该是:NO。矩阵分解算法的
我正在使用 gtk 和 xlib(xtst) 创建一个程序来将假按键发送到应用程序,我创建了这个循环来将按键发送到事件窗口: Display *dis; dis = XOpenDisp
我正在尝试使用带有隐式反馈的 Spark MLib ALS 进行协作过滤。输入数据只有两个字段userId和productId。我没有产品评分,只有用户购买过哪些产品的信息,仅此而已。因此,为了训练
我正在做一个处理 x86 汇编语言的二进制炸弹实验室作业(我相信是 at&t)。我正在运行我的代码并走到最后,但最后我将我的 306 值与这个 %al 寄存器进行比较,我不知道如何获得它的值,因为我尝
有人可以指导我在linux中ls -ali输出的每一列描述什么吗? 最佳答案 ls -ali 类似这样的事情 67403780 -rw-------. 1 root root 1114 12月
我找到了一些声称使用 openAL 列出所有音频输出设备的示例,但是我只能让它们列出当前在 OSX(Yosemite、Maverick)上选择的设备。我使用的是 mac,有默认声卡(内置输出)以及 a
我想根据日期对“ls -al”命令的输出进行排序。我可以使用命令轻松地为一列执行此操作: $ ls -al | sort -k6 -M -r 但是如何同时对第 6 列和第 7 列执行此操作?命令: $
我是一名优秀的程序员,十分优秀!