4

Hello I am trying to play audio.wav from internal storage using Superpowered::AdvancedAudioPlayer but NDK always through the Open failed: ENOENT (No such file or directory) exception. Code:

//-----------------Java---------------------------------------------------------------------------------

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyFolder/";
        String myfile = path + "filename" + ".mp3";



if (samplerateString == null) samplerateString = "48000";
        if (buffersizeString == null) buffersizeString = "480";
         samplerate = Integer.parseInt(samplerateString);
         buffersize = Integer.parseInt(buffersizeString);

//-----------------Cpp------------------------------------------------------------------------------------

SoundEffects1(samplerate,     // sampling rate
                        buffersize,     // buffer size
                        myfile,        // path to .apk package
                        fileAoffset,    // offset (start) of file A in the APK
                        fileAlength,    // length of file A
                        fileBoffset,    // offset (start) of file B in the APK
                        fileBlength,     // length of file B
                        myfile,
                        myfile
            );

Extern "C"
JNIEXPORT void JNICALL
Java_com_example_superpoweredandroidtest_Dashboard_SoundEffects1(
        JNIEnv *env,
        jobject __unused ob,
        jint samplerate,
        jint buffersize,
        jstring apkPath,
        jint fileAoffset,
        jint fileAlength,
        jint fileBoffset,
        jint fileBlength,
        jstring file1Path,
        jstring file2Path
){
    const char *path = env->GetStringUTFChars(apkPath, JNI_FALSE);

    const char *file1Name = env->GetStringUTFChars(file1Path, JNI_FALSE);
    const char *file2Name = env->GetStringUTFChars(file2Path, JNI_FALSE);


    __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "SoundEffects JNI Constructor %s",file1Name);
    soundEffects = new SoundEffects((unsigned int)samplerate, (unsigned int)buffersize,
                                    path, fileAoffset, fileAlength, fileBoffset, fileBlength,file1Name,file2Name);

 /*   env->ReleaseStringUTFChars(file1Path, file1Name);
    env->ReleaseStringUTFChars(file2Path, file2Name);
 */   env->ReleaseStringUTFChars(apkPath, path);
}



SoundEffects::SoundEffects (
        unsigned int samplerate, // device native sample rate
        unsigned int buffersize, // device native buffer size
        const char *path,        // path to APK package
        int fileAoffset,         // offset of file A in APK
        int fileAlength,         // length of file A
        int fileBoffset,         // offset of file B in APK
        int fileBlength,
        const char *file1Path,
        const char *file2Path
) : activeFx(0), numPlayersLoaded(0), crossFaderPosition(0.0f), volB(0.0f), volA(1.0f * headroom)
{

    initializeSDK();

    playerA = new Superpowered::AdvancedAudioPlayer(samplerate, 0);
    playerB = new Superpowered::AdvancedAudioPlayer(samplerate, 0);
    roll = new Superpowered::Roll(samplerate);
    filter = new Superpowered::Filter(Superpowered::Resonant_Lowpass, samplerate);
    flanger = new Superpowered::Flanger(samplerate);
    filter->resonance = 0.1f;


  //  stereoBuffer = (float *) memalign(16, (buffersize + 16) * sizeof(float) * 2);


  //  __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "file===> %s",path);



//----------------------------------------------------------------------------------------------
    std::fopen(path, "r");

    __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "SoundEffects Cpp Constructor %s",path);
      playerA->open(path);
 //   playerB->open(path);

    playerA->play();
 //-------------------working---------------------------------------------------------------------------



    //     playerA->open(path, fileAoffset, fileAlength);
//        playerB->open(path, fileBoffset, fileBlength);


    // Initialize audio engine and pass callback function.
    output = new SuperpoweredAndroidAudioIO (
            samplerate,                     // device native sample rate
            buffersize,                     // device native buffer size
            false,                          // enableInput
            true,                           // enableOutput
            audioProcessing,                // audio callback function
            this,                           // clientData
            -1,                             // inputStreamType (-1 = default)
            SL_ANDROID_STREAM_MEDIA         // outputStreamType (-1 = default)
    );

}

void SoundEffects::initializeSDK() const {
    Superpowered::Initialize(
            "ExampleLicenseKey-WillExpire-OnNextUpdate",
            false, // enableAudioAnalysis (using SuperpoweredAnalyzer, SuperpoweredLiveAnalyzer, SuperpoweredWaveform or SuperpoweredBandpassFilterbank)
            false, // enableFFTAndFrequencyDomain (using SuperpoweredFrequencyDomain, SuperpoweredFFTComplex, SuperpoweredFFTReal or SuperpoweredPolarFFT)
            false, // enableAudioTimeStretching (using SuperpoweredTimeStretching)
            true,  // enableAudioEffects (using any SuperpoweredFX class)
            true,  // enableAudioPlayerAndDecoder (using SuperpoweredAdvancedAudioPlayer or SuperpoweredDecoder)
            false, // enableCryptographics (using Superpowered::RSAPublicKey, Superpowered::RSAPrivateKey, Superpowered::hasher or Superpowered::AES)
            false  // enableNetworking (using Superpowered::httpRequest)
    );
}
Shahryar Ahmed
  • 197
  • 1
  • 9
  • 1
    `getExternalStorageDirectory()` is not internal directory. You have to have permission to access it. – codeconscious Dec 21 '20 at 13:07
  • 1
    @codeconscious Just yesterday I was reading the docs regarding the [changes](https://developer.android.com/about/versions/11/privacy/storage#app-specific-external) to file permissions, and, the way I understood it, every app gets access to ext by default, but only to a small domain folder that the os provides for them and them alone. I have slept since then, so if I'm wrong, please correct me. – Nate T Dec 25 '20 at 04:23
  • 1
    @NathanToulbert yes, all apps can access *their* external storage directory without permissions. However, in context of this question the directory being requested is not app specific, so we need permission to access it (even this behavior is being deprecated: [Environment#getExternalStorageDirectory()](https://developer.android.com/reference/android/os/Environment#getExternalStorageDirectory())) – codeconscious Dec 25 '20 at 08:43

1 Answers1

1

I have written code in C language to open and read text file is bellow and this is working fine. Hope you get some idea from this to how to open file

char *myPath;
char *myText;
char *mstrings;
JNIEXPORT jstring JNICALL
Java_com_my_apppackage_utils_Utils_readFileFromCNative(JNIEnv *env,
                                                            jobject instance, jstring path) {

    myPath = (char *) (*env)->GetStringUTFChars(env, path, 0);

    mstrings = readDocument(myPath);

    jstring myString = (*env)->NewStringUTF(env, mstrings);

//    (*env)->ReleaseStringUTFChars(env, path, myPath);

    return myString;
}

here is ReadDocument.c

#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include "ReadDocument.h"

#define MY_FILENAME_SIZE 1000

char MY_PATH[MY_FILENAME_SIZE];

FILE *fileReader;

char *readDocument(char *filename) {

    char filePath[MY_FILENAME_SIZE];
    int fileSize;
    char *contents;

    // Open file
    strcat(strcpy(filePath, MY_PATH), filename);
    if ((fileReader = fopen(filePath, "rb")) == NULL) {
        exit(EXIT_FAILURE);
    }

    // Get file size
    fseek(fileReader, 0, SEEK_END);
    fileSize = ftell(fileReader);
    rewind(fileReader);

    // Allocate string
    contents = malloc(fileSize + 1); // +1 for termination
    if (contents == NULL) {
        fclose(fileReader);
        free(fileReader);
        printf("Could not malloc contents:");
        exit(EXIT_FAILURE);
    }

    // Load dictionary
    fread(contents, fileSize, 1, fileReader);
    contents[fileSize] = 0;

    fclose(fileReader);

    return contents;
}
Priyanka
  • 3,369
  • 1
  • 10
  • 33