2013-06-07 1 views
2

짧은 버전 : 나는 synth 앱을 개발 중이며 낮은 대기 시간의 Opensl을 사용하고 있습니다. 나는 Opensl 콜백 funktion에서 모든 오디오 계산을 수행하고있었습니다. (필자는하지 말았어야했지만 어쨌든 했었습니다.) 이제 계산 결과는 내 넥서스 4에서 약 75 %의 CPU 시간을 필요로하므로 다음 단계는 모든 계산을 여러 스레드에서 수행하는 것입니다.안드로이드에서 쓰레드 지연 시간이 짧은 오디오

내가 겪은 문제점은 콜백 스레드가 분명히 높은 우선 순위에서 실행 되었기 때문에 오디오가 더듬기 시작했다는 것입니다. 새 스레드는 그렇지 않습니다. 더/더 큰 버퍼를 사용하면 문제는 사라지지만 실시간도 마찬가지입니다. 새 스레드에서 더 높은 우선 순위를 설정하면 작동하지 않는 것 같습니다. 그래서 저 지연 오디오 스레드를 수행하는 것이 가능합니까? 아니면 콜백에서 모든 작업을해야합니까?

나는 256 샘플의 버퍼를 가지고 있으며 약 5ms이고 thread-scheduler-thingie가 내 calc 스레드를 실행하기 위해서는 오래 있어야한다.

+0

콜백에서 모든 오디오 계산을하지 말아야하는 이유는 무엇입니까? 저는 Opensl에 익숙하지 않지만, 대부분의 오디오 라이브러리에서 여러분이하고 싶은 것을 정확히 알고 있습니다. 당신이 피해야하는 임의의 시간 (I/O와 같은)을 차단하는 것입니다. –

+0

@Bjorn Roche : 대기 시간이 짧다면 콜백에서 합성 작업을 수행해야합니다. 비동기 적으로 수행하면 더 많은 버퍼링이 필요하며 시스템 대기 시간이 두 배가됩니다. – marko

+0

모든 자습서를 읽은 나는 콜백에서 아주 작은 작업을 수행해야한다고 말했다. 그리고 실제로 안드로이드 ("Google"이있는 흰색 텍스트가 나오는 지점까지)가 충돌하고 콜백에 너무 많은 처리를 할 때마다 재현 할 수있었습니다. 그리고 openSL에서 콜백은 버퍼가 다 떨어지기 전에 더 많은 데이터를 원한다고 말합니다. 따라서 작업을 수행하기 위해 다른 스레드를 깨울 충분한 시간이 있어야합니다. 내 말은, 쿼드 코어 폰에서, 적어도 하나의 코어가 공회전 상태에 있어야하고, 어떤 크 런 코어 (munber) 크런치를 준비해야한다는 것입니다. – Floaf

답변

1

근본적인 문제는 synth-engine의 성능에 있다고 생각합니다. Cortex-A8 또는 -A9 CPU로 알맞은 채널 수를 단일 코어로 달성 할 수 있습니다. 어떤 언어로 구현 했습니까? Java가 발생하면 C++로 포팅하는 것이 좋습니다.

합성에 다중 스레드를 사용하는 것은 가능하지만 새로운 문제, 즉 생성 된 오디오를 혼합하기 전에 각 스레드를 동기화해야한다는 새로운 문제가 발생합니다.

비동기 적으로 합성 스레드를 실행하면 추가적인 지연 시간이 발생하지 않는 한, 렌더링 콜백에서 추가 합성 스레드에 신호를 보내고 이전에 완료 할 때까지 기다릴 가능성이 있습니다 모든 오디오를 함께 믹싱합니다.

(명백한 최적화는 렌더 콜백이 이미 CPU에서 실행 중일 때 처리 자체의 일부를 실행하고 그렇지 않으면 아무것도 수행하지 않는다는 것입니다).

여기에 문제가있다. synth 렌더링 스레드가 실시간 우선 순위로 실행되는 것을 확신 할 수 없다면, 렌더링 콜백이 실행될 때마다 일정 히트를 잡을 수 있고, 신스 렌더 스레드가 따라 잡을 때까지 기다리는 콜백 스레드를 차단할 수 있습니다.

지난 번 Android에서 오디오를 보았을 때 Bionic은 실시간 스레드 우선 순위를 설정하는 수단 (예 : SCHED_FIFO)이 부족했습니다. 어쨌든, 이것이 허용되는지 여부는 운영체제 정책의 문제이다. 데스크탑 리눅스 시스템에서는 루트가되어야하거나 적절한 것으로 조정 된 ulimit (루트 권한으로) - 나는 안드로이드가 여기서 무엇을하는지 잘 모르겠다. 다운로드 한 앱이 기본적으로이 권한을 부여받지 못했다고 매우 의심스러워합니다. 다른 유용한 권한은 mlock()이며 실제 스택에는 코드와 해당 스택이 필요합니다.

+0

예, C++로 작성되었지만 엔진의 한 인스턴스가 하나의 코어에서 실행될 수 있습니다. 아이디어는 시퀀서에 의해 다른 인스턴스가 트리거되는 신스의 여러 인스턴스를 실행하는 것입니다. 이것이 내가 여분의 컴퓨팅 파워를 필요로하는 이유입니다. 그러나 다른 한편으로는, 나는 아마도 그것들을 약간의 버퍼로 계산/렌더링 할 수있을 것이고 콜백의 메인 신스 인스턴스를 다룰 수있을 것이다. – Floaf

+0

그리고 당신은 스레드 우선 순위에 대해 옳았습니다. 앱은 우선 순위를 낮추고 상승시키지 않습니다. 나는 콜백 스레드가 높은 우선 순위로 실행되기 때문에 약간 좌절 한 것 같다. – Floaf

+0

@Floaf : 그 접근법은 잘 작동 할 것입니다. 사실, 꽤 많이 계산할 수 있습니다. 한 번에 두 개의 음색을 렌더링하여 신디 엔진을 병렬 처리 할 수 ​​있는지 생각할 수도 있습니다. NEON 방식을 훨씬 능률적으로 활용할 수 있습니다. 어쨌든 저렴한 승리를 거머쥘 수 있습니다. 조언이 한 가지 더 있습니다. iPad 또는 iPhone을 편리하게 사용할 수있는 경우 Apple의 프로파일 링 도구는 Android의 모든 것보다 * 좋은 방법입니다. 문자 그대로 지침 수준까지 프로파일 링하고 알고리즘의 값 비싼 부분을 찾을 수 있습니다. 그 결과는 다른 ARM 장치에서 가까운 것입니다. – marko