Use callbacks for Midi I/O

Instead of having the Sonivox engine directly open the file and
use stdio to read from it, use caller-provided callbacks.

Change-Id: Ie55129109060a4a7862fee3177f994401e00b6c1
diff --git a/media/libmediaplayerservice/MediaPlayerFactory.cpp b/media/libmediaplayerservice/MediaPlayerFactory.cpp
index 3e0fc0d..d149290 100644
--- a/media/libmediaplayerservice/MediaPlayerFactory.cpp
+++ b/media/libmediaplayerservice/MediaPlayerFactory.cpp
@@ -15,11 +15,15 @@
 ** limitations under the License.
 */
 
+//#define LOG_NDEBUG 0
 #define LOG_TAG "MediaPlayerFactory"
 #include <utils/Log.h>
 
 #include <cutils/properties.h>
 #include <media/IMediaPlayer.h>
+#include <media/MidiIoWrapper.h>
+#include <media/stagefright/DataSource.h>
+#include <media/stagefright/FileSource.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <utils/Errors.h>
 #include <utils/misc.h>
@@ -279,7 +283,6 @@
                 }
             }
         }
-
         return 0.0;
     }
 
@@ -295,14 +298,10 @@
 
         // Some kind of MIDI?
         EAS_DATA_HANDLE easdata;
+        sp<MidiIoWrapper> wrapper = new MidiIoWrapper(fd, offset, length);
         if (EAS_Init(&easdata) == EAS_SUCCESS) {
-            EAS_FILE locator;
-            locator.path = NULL;
-            locator.fd = fd;
-            locator.offset = offset;
-            locator.length = length;
             EAS_HANDLE  eashandle;
-            if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) {
+            if (EAS_OpenFile(easdata, wrapper->getLocator(), &eashandle) == EAS_SUCCESS) {
                 EAS_CloseFile(easdata, eashandle);
                 EAS_Shutdown(easdata);
                 return kOurScore;
diff --git a/media/libmediaplayerservice/MidiFile.cpp b/media/libmediaplayerservice/MidiFile.cpp
index 749ef96..205d44f 100644
--- a/media/libmediaplayerservice/MidiFile.cpp
+++ b/media/libmediaplayerservice/MidiFile.cpp
@@ -60,11 +60,6 @@
 {
     ALOGV("constructor");
 
-    mFileLocator.path = NULL;
-    mFileLocator.fd = -1;
-    mFileLocator.offset = 0;
-    mFileLocator.length = 0;
-
     // get the library configuration and do sanity check
     if (pLibConfig == NULL)
         pLibConfig = EAS_Config();
@@ -126,11 +121,8 @@
     }
 
     // open file and set paused state
-    mFileLocator.path = strdup(path);
-    mFileLocator.fd = -1;
-    mFileLocator.offset = 0;
-    mFileLocator.length = 0;
-    EAS_RESULT result = EAS_OpenFile(mEasData, &mFileLocator, &mEasHandle);
+    mIoWrapper = new MidiIoWrapper(path);
+    EAS_RESULT result = EAS_OpenFile(mEasData, mIoWrapper->getLocator(), &mEasHandle);
     if (result == EAS_SUCCESS) {
         updateState();
     }
@@ -157,10 +149,8 @@
     }
 
     // open file and set paused state
-    mFileLocator.fd = dup(fd);
-    mFileLocator.offset = offset;
-    mFileLocator.length = length;
-    EAS_RESULT result = EAS_OpenFile(mEasData, &mFileLocator, &mEasHandle);
+    mIoWrapper = new MidiIoWrapper(fd, offset, length);
+    EAS_RESULT result = EAS_OpenFile(mEasData, mIoWrapper->getLocator(), &mEasHandle);
     updateState();
 
     if (result != EAS_SUCCESS) {
@@ -329,7 +319,7 @@
         EAS_HANDLE easHandle = NULL;
         EAS_RESULT result = EAS_Init(&easData);
         if (result == EAS_SUCCESS) {
-            result = EAS_OpenFile(easData, &mFileLocator, &easHandle);
+            result = EAS_OpenFile(easData, mIoWrapper->getLocator(), &easHandle);
         }
         if (result == EAS_SUCCESS) {
             result = EAS_Prepare(easData, easHandle);
@@ -395,17 +385,8 @@
         EAS_CloseFile(mEasData, mEasHandle);
         mEasHandle = NULL;
     }
-    if (mFileLocator.path) {
-        free((void*)mFileLocator.path);
-        mFileLocator.path = NULL;
-    }
-    if (mFileLocator.fd >= 0) {
-        close(mFileLocator.fd);
-    }
-    mFileLocator.fd = -1;
-    mFileLocator.offset = 0;
-    mFileLocator.length = 0;
 
+    mIoWrapper.clear();
     mPlayTime = -1;
     mDuration = -1;
     mLoop = false;
diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h
index 82e4e88..48a42aa 100644
--- a/media/libmediaplayerservice/MidiFile.h
+++ b/media/libmediaplayerservice/MidiFile.h
@@ -20,6 +20,7 @@
 
 #include <media/MediaPlayerInterface.h>
 #include <libsonivox/eas.h>
+#include <media/MidiIoWrapper.h>
 
 namespace android {
 
@@ -63,7 +64,6 @@
         return INVALID_OPERATION;
     }
 
-
 private:
             status_t    createOutputTrack();
             status_t    reset_nosync();
@@ -78,7 +78,7 @@
     EAS_I32             mPlayTime;
     EAS_I32             mDuration;
     EAS_STATE           mState;
-    EAS_FILE            mFileLocator;
+    sp<MidiIoWrapper>   mIoWrapper;
     audio_stream_type_t mStreamType;
     bool                mLoop;
     volatile bool       mExit;