小编don*_*ner的帖子

如何用 Oboe 正确播放解码的内存 PCM?

我使用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)

audio android android-ndk oboe

5
推荐指数
1
解决办法
1803
查看次数

应该将常量放在界面中吗?

我知道将常量放在界面中通常被认为是不好的做法,但......

我正在使用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),所以很遗憾不能使用枚举类型.

java oop design-patterns

4
推荐指数
1
解决办法
1193
查看次数

使用取消引用的指针时,为什么 EXPECT_CALL 测试会意外通过?

我刚刚开始使用 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)

c++ unit-testing pointers googletest googlemock

3
推荐指数
1
解决办法
1408
查看次数

是什么导致 JNI 错误“使用已删除的本地引用”?

我有一个 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 java java-native-interface android jvm

3
推荐指数
1
解决办法
3998
查看次数

为什么用这个简单的代码生成了如此多的LDR和STR指令?

我有一个简单的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)

assembly gcc arm compiler-optimization cortex-m

2
推荐指数
1
解决办法
297
查看次数

为什么在为 Android 编译 FFmpeg 时出现“错误:无效指令助记符”?

我正在尝试使用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 ffmpeg clang android-ndk android-ffmpeg

2
推荐指数
1
解决办法
3912
查看次数

在Android Studio中错误计算CMake服务器结果

在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)

android-ndk android-studio

2
推荐指数
1
解决办法
2117
查看次数

应该将"下载"功能封装在对象或其他地方吗?

我有一个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吗?比如在一个名为?的新类中?这个问题有设计模式吗?

java oop

1
推荐指数
1
解决办法
124
查看次数