我使用oboe来播放 ndk 库中的声音,并使用带有 Android 扩展的 OpenSL将 wav 文件解码为 PCM。解码后的带符号 16 位 PCM 存储在内存中 ( std::forward_list<int16_t>),然后通过回调将它们发送到双簧管流中。我从手机中听到的声音在音量级别上与原始 wav 文件相似,但是这种声音的“质量”却并非如此——它会爆裂和爆裂。
我猜测我以错误的顺序或格式(采样率?)在音频流中发送 PCM。如何使用 OpenSL 解码双簧管音频流?
要将文件解码为 PCM,我使用AndroidSimpleBufferQueue作为接收器,并使用AndroidFD和AAssetManager作为源:
// Loading asset
AAsset* asset = AAssetManager_open(manager, path, AASSET_MODE_UNKNOWN);
off_t start, length;
int fd = AAsset_openFileDescriptor(asset, &start, &length);
AAsset_close(asset);
// Creating audio source
SLDataLocator_AndroidFD loc_fd = { SL_DATALOCATOR_ANDROIDFD, fd, start, length };
SLDataFormat_MIME format_mime = { SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED };
SLDataSource audio_source = { &loc_fd, &format_mime }; …Run Code Online (Sandbox Code Playgroud) 我知道将常量放在界面中通常被认为是不好的做法,但......
我正在使用Observer模式将事件从对象广播到侦听器.
interface DownloadListener
{
public void sendEvent(int eventId);
}
Run Code Online (Sandbox Code Playgroud)
广播公司使用常量int来告诉听众哪个事件发生了.
class DownloadTask
{
public static final int EVENT_DOWNLOAD_STARTED = 1;
public static final int EVENT_DOWNLOAD_COMPLETED = 2; //should these go here?
DownloadTask(DownloadListener listener)
{
listener.sendEvent(EVENT_DOWNLOAD_STARTED);
}
}
Run Code Online (Sandbox Code Playgroud)
将常量放在界面中会更好吗?我的想法是接口是广播公司和听众之间的契约,因此它应该包含该合同的细节(常量).
我正在开发移动设备(Java 1.3),所以很遗憾不能使用枚举类型.
我刚刚开始使用 GoogleTest 和 GoogleMock。阅读“for dummies”文档,该示例测试了一个Painter依赖于以下内容的类Turtle:
真实对象 - Turtle.h
class Turtle {
public:
virtual ~Turtle() {}
virtual void PenDown() = 0;
};
Run Code Online (Sandbox Code Playgroud)
模拟对象-mock-turtle.h
class MockTurtle : public Turtle {
public:
MOCK_METHOD0(PenDown, void());
};
Run Code Online (Sandbox Code Playgroud)
测试中的代码 - Painter.h
class Painter {
public:
Painter(Turtle *turtle){};
};
Run Code Online (Sandbox Code Playgroud)
单元测试 - test_painter.cpp
这是为了测试该turtle.PenDown()方法是否是从Painter构造函数中调用的。
TEST(PainterTest, CanDrawSomething) {
MockTurtle turtle;
EXPECT_CALL(turtle, PenDown())
.Times(AtLeast(1));
Painter painter(&turtle);
}
Run Code Online (Sandbox Code Playgroud)
该测试正确失败,因为PenDown()从未被调用。
但是,如果我将测试更改为使用取消引用的指针,则会错误地MockTurtle通过。
TEST(PainterTest, CanDrawSomething) {
MockTurtle *turtle = …Run Code Online (Sandbox Code Playgroud) 我有一个 Android 应用程序,其中在应用程序启动时调用以下 C 方法(在 中Activity.onCreate)。
extern "C"
JNIEXPORT jstring JNICALL
Java_com_google_oboe_test_oboetest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject instance) {
jclass sysclazz = env->FindClass("java/lang/System");
jmethodID getPropertyMethod = env->GetStaticMethodID(sysclazz, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, "os.name");
return result;
}
Run Code Online (Sandbox Code Playgroud)
当调用此方法时,应用程序崩溃并出现错误:
JNI 在应用程序中检测到错误:使用已删除的本地引用 0xd280e8d5
步骤调试显示这一行导致崩溃:
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, "os.name");
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个错误?以及如何System.getProperty("os.name")使用 JNI调用而不会出现此错误?
我有一个简单的C程序:
int main(){
unsigned int counter = 0;
++counter;
++counter;
++counter;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下编译标志:
arm-none-eabi-gcc -c -mcpu=cortex-m4 -march=armv7e-m -mthumb
-mfloat-abi=hard -mfpu=fpv4-sp-d16 -DPART_TM4C123GH6PM -O0
-ffunction-sections -fdata-sections -g -gdwarf-3 -gstrict-dwarf
-Wall -MD -std=c99 -c -MMD -MP -MF"main.d" -MT"main.o" -o"main.o" "../main.c"
Run Code Online (Sandbox Code Playgroud)
(为简洁起见,删除了一些-I指令)
请注意,我故意使用-O0禁用优化,因为我有兴趣了解编译器要优化的内容.
这将编译为ARM Cortex-M4的以下程序集:
6 unsigned int counter = 0;
00000396: 2300 movs r3, #0
00000398: 607B str r3, [r7, #4]
7 ++counter;
0000039a: 687B ldr r3, [r7, #4]
0000039c: 3301 adds r3, #1
0000039e: 607B str r3, [r7, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用NDK (r18.1.5063045)为 Android编译FFmpeg 4.0clang。我的主机架构是 Mac OS。
这是我的配置命令:
./configure \
--target-os=android \
--arch=armv7-a \
--enable-cross-compile \
--cc=${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang \
--enable-shared \
--disable-static
Run Code Online (Sandbox Code Playgroud)
这将成功完成。所以我运行make -j8并收到以下错误:
In file included from libavfilter/vf_mestimate.c:22:
In file included from ./libavcodec/mathops.h:40:
./libavcodec/arm/mathops.h:90:26: error: invalid instruction mnemonic 'itt'
"cmp %1, %2 \n\t"
^
<inline asm>:3:2: note: instantiated into assembly here
itt gt
^~~
Run Code Online (Sandbox Code Playgroud)
知道是什么原因造成的吗?
在Android Studio中,尝试构建项目时出现以下错误:
Error computing CMake server result.
Check for working C compiler: /Users/donturner/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang
Check for working C compiler: /Users/donturner/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
Check for working CXX compiler: /Users/donturner/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++
Check for working CXX compiler: /Users/donturner/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Detecting CXX compile features
Detecting CXX compile features - done
Configuring …Run Code Online (Sandbox Code Playgroud) 我有一个Dog对象,每个Dog都有一个colour和一个photoUrl,这是它的照片在互联网上.
class Dog {
private String colour;
private String photoUrl;
private Bitmap photo;
public Dog(String colour, String photoUrl){
this.colour = colour;
this.photoUrl = photoUrl;
}
}
Run Code Online (Sandbox Code Playgroud)
我想下载照片并将其存储在磁盘上.我应该在Dog.download()其他地方实现下载功能FileDownloader吗?比如在一个名为?的新类中?这个问题有设计模式吗?
android ×3
android-ndk ×3
java ×3
oop ×2
arm ×1
assembly ×1
audio ×1
c ×1
c++ ×1
clang ×1
cortex-m ×1
ffmpeg ×1
gcc ×1
googlemock ×1
googletest ×1
jvm ×1
oboe ×1
pointers ×1
unit-testing ×1