Rename .c files compiled as c++ to .cpp
Compiling .c files as .cpp with -x c++ -std=c++11 is delicate, rename
the .c files to .cpp instead.
Also fix some other makefile issues:
Use LOCAL_EXPORT_C_INCLUDE_DIRS and LOCAL_EXPORT_SHARED_LIBRARY_HEADERS
instead of $(call include-path-for,...), which is deprecated.
Remove LOCAL_MODULE_TAGS := optional, that is the default.
Test: mma -j
Change-Id: I482be683abb4dffbb46fb4d1af07a5ec8fcfb908
diff --git a/src/itf/IStreamInformation.cpp b/src/itf/IStreamInformation.cpp
index 2141533..582bc2a 100644
--- a/src/itf/IStreamInformation.cpp
+++ b/src/itf/IStreamInformation.cpp
@@ -14,5 +14,308 @@
* limitations under the License.
*/
-// Force compilation of code as C++
-#include "IStreamInformation.c"
+/* StreamInformation implementation */
+
+#include "sles_allinclusive.h"
+
+static XAresult IStreamInformation_QueryMediaContainerInformation( XAStreamInformationItf self,
+ XAMediaContainerInformation * info /* [out] */)
+{
+ XA_ENTER_INTERFACE
+
+ if (NULL == info) {
+ result = XA_RESULT_PARAMETER_INVALID;
+ XA_LEAVE_INTERFACE
+ }
+
+#ifdef ANDROID
+ IStreamInformation *thiz = (IStreamInformation *) self;
+ interface_lock_shared(thiz);
+ // always storing container info at index 0, as per spec
+ *info = thiz->mStreamInfoTable.itemAt(0).containerInfo;
+ interface_unlock_shared(thiz);
+ // even though the pointer to the media container info is returned, the values aren't set
+ // for the actual container in this version, they are simply initialized to defaults
+ // (see IStreamInformation_init)
+ result = XA_RESULT_SUCCESS;
+#else
+ SL_LOGE("QueryMediaContainerInformation is unsupported");
+ memset(info, 0, sizeof(XAMediaContainerInformation));
+ result = XA_RESULT_FEATURE_UNSUPPORTED;
+#endif
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_QueryStreamType( XAStreamInformationItf self,
+ XAuint32 streamIndex, /* [in] */
+ XAuint32 *domain) /* [out] */
+{
+ XA_ENTER_INTERFACE
+
+ if (NULL == domain) {
+ result = XA_RESULT_PARAMETER_INVALID;
+ XA_LEAVE_INTERFACE;
+ }
+
+#ifndef ANDROID
+ *domain = XA_DOMAINTYPE_UNKNOWN;
+#else
+ if (0 == streamIndex) {
+ // stream 0 is reserved for the container
+ result = XA_RESULT_PARAMETER_INVALID;
+ *domain = XA_DOMAINTYPE_UNKNOWN;
+ } else {
+ IStreamInformation *thiz = (IStreamInformation *) self;
+
+ interface_lock_shared(thiz);
+
+ XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
+ // streams in the container are numbered 1..nbStreams
+ if (streamIndex <= nbStreams) {
+ result = XA_RESULT_SUCCESS;
+ *domain = thiz->mStreamInfoTable.itemAt(streamIndex).domain;
+ } else {
+ SL_LOGE("Querying stream type for stream %d, only %d streams available",
+ streamIndex, nbStreams);
+ result = XA_RESULT_PARAMETER_INVALID;
+ }
+
+ interface_unlock_shared(thiz);
+ }
+#endif
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_QueryStreamInformation( XAStreamInformationItf self,
+ XAuint32 streamIndex, /* [in] */
+ void * info) /* [out] */
+{
+ XA_ENTER_INTERFACE
+
+ if (NULL == info) {
+ result = XA_RESULT_PARAMETER_INVALID;
+ } else {
+
+#ifndef ANDROID
+ result = XA_RESULT_FEATURE_UNSUPPORTED;
+#else
+
+ IStreamInformation *thiz = (IStreamInformation *) self;
+
+ interface_lock_shared(thiz);
+
+ XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
+ // stream 0 is the container, and other streams in the container are numbered 1..nbStreams
+ if (streamIndex <= nbStreams) {
+ result = XA_RESULT_SUCCESS;
+ const StreamInfo& streamInfo = thiz->mStreamInfoTable.itemAt((size_t)streamIndex);
+
+ switch (streamInfo.domain) {
+ case XA_DOMAINTYPE_CONTAINER:
+ *(XAMediaContainerInformation *)info = streamInfo.containerInfo;
+ break;
+ case XA_DOMAINTYPE_AUDIO:
+ *(XAAudioStreamInformation *)info = streamInfo.audioInfo;
+ break;
+ case XA_DOMAINTYPE_VIDEO:
+ *(XAVideoStreamInformation *)info = streamInfo.videoInfo;
+ break;
+ case XA_DOMAINTYPE_IMAGE:
+ *(XAImageStreamInformation *)info = streamInfo.imageInfo;
+ break;
+ case XA_DOMAINTYPE_TIMEDTEXT:
+ *(XATimedTextStreamInformation *)info = streamInfo.textInfo;
+ break;
+ case XA_DOMAINTYPE_MIDI:
+ *(XAMIDIStreamInformation *)info = streamInfo.midiInfo;
+ break;
+ case XA_DOMAINTYPE_VENDOR:
+ *(XAVendorStreamInformation *)info = streamInfo.vendorInfo;
+ break;
+ default:
+ SL_LOGE("StreamInformation::QueryStreamInformation index %u has "
+ "unknown domain %u", streamIndex, streamInfo.domain);
+ result = XA_RESULT_INTERNAL_ERROR;
+ break;
+ }
+
+ } else {
+ SL_LOGE("Querying stream type for stream %d, only %d streams available",
+ streamIndex, nbStreams);
+ result = XA_RESULT_PARAMETER_INVALID;
+ }
+
+ interface_unlock_shared(thiz);
+#endif
+
+ }
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_QueryStreamName( XAStreamInformationItf self,
+ XAuint32 streamIndex, /* [in] */
+ XAuint16 * pNameSize, /* [in/out] */
+ XAchar * pName) /* [out] */
+{
+ XA_ENTER_INTERFACE
+
+ if (NULL == pNameSize || streamIndex == 0) {
+ result = XA_RESULT_PARAMETER_INVALID;
+ } else {
+#ifdef ANDROID
+ IStreamInformation *thiz = (IStreamInformation *) self;
+ interface_lock_shared(thiz);
+
+ XAuint32 nbStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
+ // streams in the container are numbered 1..nbStreams
+ if (streamIndex <= nbStreams) {
+ char streamName[16]; // large enough for the fixed format in next line
+ snprintf(streamName, sizeof(streamName), "stream%u", streamIndex);
+ size_t actualNameLength = strlen(streamName);
+ if (NULL == pName) {
+ // application is querying the name length in order to allocate a buffer
+ result = XA_RESULT_SUCCESS;
+ } else {
+ SLuint16 availableNameLength = *pNameSize;
+ if (actualNameLength > availableNameLength) {
+ memcpy(pName, streamName, availableNameLength);
+ result = XA_RESULT_BUFFER_INSUFFICIENT;
+ } else if (actualNameLength == availableNameLength) {
+ memcpy(pName, streamName, availableNameLength);
+ result = XA_RESULT_SUCCESS;
+ } else { // actualNameLength < availableNameLength
+ memcpy(pName, streamName, actualNameLength + 1);
+ result = XA_RESULT_SUCCESS;
+ }
+ }
+ *pNameSize = actualNameLength;
+ } else {
+ result = XA_RESULT_PARAMETER_INVALID;
+ }
+
+ interface_unlock_shared(thiz);
+#else
+ SL_LOGE("unsupported XAStreamInformationItf function");
+ result = XA_RESULT_FEATURE_UNSUPPORTED;
+#endif
+ }
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_RegisterStreamChangeCallback( XAStreamInformationItf self,
+ xaStreamEventChangeCallback callback, /* [in] */
+ void * pContext) /* [in] */
+{
+ XA_ENTER_INTERFACE
+
+ IStreamInformation *thiz = (IStreamInformation *) self;
+
+ interface_lock_exclusive(thiz);
+
+ thiz->mCallback = callback;
+ thiz->mContext = pContext;
+ result = SL_RESULT_SUCCESS;
+
+ interface_unlock_exclusive(thiz);
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_QueryActiveStreams( XAStreamInformationItf self,
+ XAuint32 *numStreams, /* [in/out] */
+ XAboolean *activeStreams) /* [out] */
+{
+ XA_ENTER_INTERFACE
+
+ if (NULL == numStreams) {
+ result = XA_RESULT_PARAMETER_INVALID;
+ XA_LEAVE_INTERFACE;
+ }
+
+#ifdef ANDROID
+ IStreamInformation *thiz = (IStreamInformation *) self;
+ interface_lock_shared(thiz);
+
+ result = XA_RESULT_SUCCESS;
+ *numStreams = thiz->mStreamInfoTable.itemAt(0).containerInfo.numStreams;
+ // FIXME not setting activeStreams
+
+ interface_unlock_shared(thiz);
+#else
+ result = SL_RESULT_FEATURE_UNSUPPORTED;
+#endif
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static XAresult IStreamInformation_SetActiveStream( XAStreamInformationItf self,
+ XAuint32 streamNum, /* [in] */
+ XAboolean active, /* [in] */
+ XAboolean commitNow) /* [in] */
+{
+ XA_ENTER_INTERFACE
+
+ SL_LOGE("unsupported XAStreamInformationItf function");
+ result = XA_RESULT_FEATURE_UNSUPPORTED;
+
+ XA_LEAVE_INTERFACE
+}
+
+
+static const struct XAStreamInformationItf_ IStreamInformation_Itf = {
+ IStreamInformation_QueryMediaContainerInformation,
+ IStreamInformation_QueryStreamType,
+ IStreamInformation_QueryStreamInformation,
+ IStreamInformation_QueryStreamName,
+ IStreamInformation_RegisterStreamChangeCallback,
+ IStreamInformation_QueryActiveStreams,
+ IStreamInformation_SetActiveStream
+};
+
+
+void IStreamInformation_init(void *self)
+{
+ SL_LOGV("IStreamInformation_init\n");
+ IStreamInformation *thiz = (IStreamInformation *) self;
+ thiz->mItf = &IStreamInformation_Itf;
+
+ thiz->mCallback = NULL;
+ thiz->mContext = NULL;
+
+ for (int i=0 ; i < NB_SUPPORTED_STREAMS ; i++) {
+ thiz->mActiveStreams[i] = XA_BOOLEAN_FALSE;
+ }
+
+#ifdef ANDROID
+ // placement new constructor for C++ field within C struct
+ (void) new (&thiz->mStreamInfoTable) android::Vector<StreamInfo>();
+ // initialize container info
+ StreamInfo contInf;
+ contInf.domain = XA_DOMAINTYPE_CONTAINER;
+ contInf.containerInfo.containerType = XA_CONTAINERTYPE_UNSPECIFIED;
+ contInf.containerInfo.mediaDuration = XA_TIME_UNKNOWN;
+ // FIXME shouldn't this be 1 ?
+ contInf.containerInfo.numStreams = 0;
+ // always storing container info at index 0, as per spec: here, the table was still empty
+ thiz->mStreamInfoTable.add(contInf);
+#endif
+}
+
+
+void IStreamInformation_deinit(void *self) {
+#ifdef ANDROID
+ IStreamInformation *thiz = (IStreamInformation *) self;
+ // explicit destructor
+ thiz->mStreamInfoTable.~Vector<StreamInfo>();
+#endif
+}