JNI .cpp 파일에서 SoundTouch * (SoundTouch는 C++ 오디오 처리로 안드로이드 프로젝트에서 사용하기 위해 포장하고 있습니다)가있는 구조체가 있고 초기화합니다 이 같은 전역 개체로서 구조체의 벡터 : 나는 단지 SoundTouchExt 중 하나가 내 프로그램에서 한 번에 객체를 사용 적어도 경우는, 작동전역 객체를 포인터로 초기화하는 것이 성공하는 유일한 방법입니다.
struct SoundTouchExt
{
SoundTouch* sTouch;
queue<signed char>* fBufferOut;
int channels;
int sampleRate;
float tempoChange;
int pitchSemi;
int bytesPerSample;
SoundTouchExt()
{
sTouch = new SoundTouch();
fBufferOut = new queue<signed char>();
}
};
const int MAX_TRACKS = 16;
vector<SoundTouchExt> sProcessors(MAX_TRACKS);
(즉 다른 이야기의 일종이지만, 아마도 관련 - 재생중인 여러 인스턴스로 인해 왜곡 된 결과가 발생 함). 최대한 빨리 잘 컴파일하지만 난 FAULT 11 (독방 감금 오류를) 얻을, 참고로, 포인터를 나는이 SoundTouch sTouch;
처럼 선언하는 경우
그러나 new
을 주석하고 그에 따라 (.
-->
를) 그것의 사용을 변경 프로그램이 객체를 사용하려고 시도 할 때 그런 일이 어디
은 다음과 같습니다 약간의 연구와
...
SoundTouchExt& soundTouch = sProcessors.at(track);
setup(soundTouch, channels, samplingRate, bytesPerSample, tempo, pitchSemi);
}
static void setup(SoundTouchExt& soundTouch, int channels, int sampleRate, int bytesPerSample, float tempoChange, float pitchSemi)
{
SoundTouch& sTouch = soundTouch.sTouch;
soundTouch.channels = channels;
soundTouch.sampleRate = sampleRate;
soundTouch.bytesPerSample = bytesPerSample;
soundTouch.tempoChange = tempoChange;
soundTouch.pitchSemi = pitchSemi;
sTouch.setSampleRate(sampleRate);
sTouch.setChannels(channels);
...
}
, 나는 이것이 static intialization order fiasco의 인스턴스가 될 수있다 생각하고 있어요. 라이브러리 소스 코드에 전역 변수가 표시되지 않지만 C++에 대해 충분히 알지 못해서 무엇을 찾아야할지 모릅니다.
내 관찰에서 라이브러리에 대해 제안 할 수있는 것은 무엇입니까 (아니면 올바르게 수행하지 않았을 수 있습니다)?
사실 나는 확실히 하나의 SoundTouch 인스턴스를 가리 키려고하지 않았습니다. 당신은 거의 모든 것에 머리에 완벽하게 못을 박았습니다. 고마워요. –