実現したいこと
OpenALの理解を試みている、プログラミング初心者の学生です。
Xcodeを用いて1秒間440Hzのサイン波を再生したいと思っています。
困っていること
参考にしているコードが少々古いせいか、alから始まる各所において「macOS10.15以降、非推奨」と出てしまい、buildすることができません。現環境ではどのように書き換えれば実装することが可能でしょうか?また、もしよろしければこのようなバージョンの変化に対応するためには、どのように調べればいいのか(何を検索すれば良いのか、どこを見れば良いのか)?ご教授いただけると幸いです。
環境
MacOS 11.4
Xcode 12.5
ソース
C++
1#define _USE_MATH_DDEFINES 2 3#include <OpenAL/al.h> 4#include <OpenAL/alc.h> 5#include <array> 6#include <cmath> 7#include <limits> 8#include <thread> 9 10int main(){ 11 //OpenAlの初期化 12 ALCdevice* device = alcOpenDevice(nullptr); 13 ALCcontext* context = alcCreateContext(device, nullptr); 14 15 //1秒分のサイン波(440Hz)を生成 16 const size_t pcm_freg = 44100; 17 const float key_freg = 440.0; 18 std::array<ALshort,pcm_freg> pcm_data; 19 for(size_t i = 0; i < pcm_data.size(); ++i){ 20 pcm_data[i] = std::sin(key_freg*M_PI*2.0*i/pcm_freg) * std::numeric_limits<ALshort>::max(); 21 } 22 23 //バッファの生成 24 ALuint buffer_id; 25 alGenBuffers(1, &buffer_id); 26 27 //用意したサイン波をバッファにコピー 28 alBufferData(buffer_id,AL_FORMAT_MONO16,&pcm_data[0],pcm_data.size() * sizeof(ALshort),pcm_freg); 29 30 //ソースの生成 31 ALuint source_id; 32 alGenSources(1, &source_id); 33 34 //ソースに再生するバッファを割り当てる 35 alSourcei(source_id, AL_BUFFER, buffer_id); 36 37 //ソースの再生開始 38 alSourcePlay(source_id); 39 40 //1秒待つ 41 std::this_thread::sleep_for(std::chrono::seconds(1)); 42 43 //ソースへのバッファの割り当て解除 44 alSourcei(source_id, AL_BUFFER, 0); 45 46 //ソースの破棄 47 alDeleteSources(1, &source_id); 48 49 //バッファの破棄 50 alDeleteBuffers(1, &buffer_id); 51 52 //OpenALの後始末 53 alcMakeContextCurrent(nullptr); 54 alcDestroyContext(context); 55 alcCloseDevice(device); 56} 57
エラーコード(一例でalで始まる各所に同じエラー)
sound_test.cpp:19:25: warning: 'alcOpenDevice' is deprecated: first deprecated in macOS 10.15 - OpenAL is deprecated in favor of AVAudioEngine [-Wdeprecated-declarations]
ALCdevice* device = alcOpenDevice(nullptr);
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework/Headers/alc.h:209:38: note: 'alcOpenDevice' has been explicitly marked deprecated here
ALC_API ALCdevice * ALC_APIENTRY alcOpenDevice( const ALCchar *devicename ) OPENAL_DEPRECATED;
^
あなたの回答
tips
プレビュー