From 72be2f3bec4899055acf9ddf9bcc6dd7be9807b4 Mon Sep 17 00:00:00 2001 From: HookedBehemoth Date: Wed, 19 Feb 2020 02:00:24 +0100 Subject: [PATCH] fix movie write and add comments --- nx/include/switch/services/caps.h | 5 -- nx/include/switch/services/capsc.h | 113 ++++++++++++++++++++++++++++- nx/source/services/capsc.c | 30 ++++---- 3 files changed, 124 insertions(+), 24 deletions(-) diff --git a/nx/include/switch/services/caps.h b/nx/include/switch/services/caps.h index da2ad48a..79047cb0 100644 --- a/nx/include/switch/services/caps.h +++ b/nx/include/switch/services/caps.h @@ -200,11 +200,6 @@ typedef struct { u64 unk_x8; ///< Unknown } CapsAlbumCache; -/// AlbumCommitOutput -typedef struct { - u64 unk[4]; ///< Unknown. Official sw sets this to 0. -} CapsAlbumCommitOutput; - /// Gets the ShimLibraryVersion. u64 capsGetShimLibraryVersion(void); diff --git a/nx/include/switch/services/capsc.h b/nx/include/switch/services/capsc.h index 2f2032ff..a5d81901 100644 --- a/nx/include/switch/services/capsc.h +++ b/nx/include/switch/services/capsc.h @@ -149,7 +149,7 @@ Result capscGetAlbumMovieStreamSize(u64 stream, u64 *size); /** * @brief Reads data from an AlbumMovieReadStream. * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. - * @note When offset(+size) goes beyond the size from \ref capsaGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. * @note Only available on [4.0.0+]. * @param[in] stream Stream handle. * @param[in] offset Offset. @@ -180,7 +180,7 @@ Result capscGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size); * @note Only available on [4.0.0+]. * @param[in] stream Stream handle. * @param[in] offset Offset. - * @param[out] Output data buffer. + * @param[out] buffer Output data buffer. * @param[in] size Data buffer size. * @param[out] actual_size Actual read size. */ @@ -203,18 +203,125 @@ Result capscReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShot * @param[in] entry \ref CapsAlbumFileId */ Result capscOpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_id); + +/** + * @brief Finish write to AlbumMovieWriteStream. + * @note Writes copies file from save to destination storage and deletes the temporary file. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscFinishAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes a finished AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscCommitAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes an AlbumMovieWriteStream in any state. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscDiscardAlbumMovieWriteStream(u64 stream); + +/** + * @brief Closes an AlbumMovieWriteStream in any state without deleting the temporary file. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscDiscardAlbumMovieWriteStreamNoDelete(u64 stream); -Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumCommitOutput *out); + +/** + * @brief Closes a finished AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] entry \ref CapsAlbumEntry + */ +Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry); + +/** + * @brief Start AlbumMovieWriteStream data section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscStartAlbumMovieWriteStreamDataSection(u64 stream); + +/** + * @brief End AlbumMovieWriteStream data section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscEndAlbumMovieWriteStreamDataSection(u64 stream); + +/** + * @brief Start AlbumMovieWriteStream meta section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscStartAlbumMovieWriteStreamMetaSection(u64 stream); + +/** + * @brief End AlbumMovieWriteStream meta section. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscEndAlbumMovieWriteStreamMetaSection(u64 stream); + +/** + * @brief Reads data from an AlbumMovieWriteStream. + * @note offset(+size) must not be negative. offset and size must be aligned to 0x40000-bytes. + * @note When offset(+size) goes beyond the size from \ref capscGetAlbumMovieStreamSize, the regions of the buffer which goes beyond that are cleared to 0, and actual_size is still set to the input size. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] buffer Output data buffer. + * @param[in] size Data buffer size. + * @param[out] actual_size Actual read size. + */ Result capscReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size); + +/** + * @brief Write data to an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] buffer Input data buffer. + * @param[in] size Data buffer size. + */ Result capscWriteDataToAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size); + +/** + * @brief Write meta data to an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[in] offset Offset. + * @param[out] buffer Input data buffer. + * @param[in] size Data buffer size. + */ Result capscWriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size); + +/** + * @brief Gets the BrokenReason for an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + */ Result capscGetAlbumMovieWriteStreamBrokenReason(u64 stream); + +/** + * @brief Gets the data size of an AlbumMovieWriteStream. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the data section. + */ Result capscGetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size); + +/** + * @brief Sets the data size of an AlbumMovieWriteStream. + * @note Must not be bigger than 2GiB. + * @note Only available on [4.0.0+]. + * @param[in] stream Stream handle. + * @param[out] size Size of the data section. + */ Result capscSetAlbumMovieWriteStreamDataSize(u64 stream, u64 size); diff --git a/nx/source/services/capsc.c b/nx/source/services/capsc.c index ce64e927..c1b2bdfd 100644 --- a/nx/source/services/capsc.c +++ b/nx/source/services/capsc.c @@ -179,7 +179,7 @@ static Result _capscControlReadDataFromAlbumMovieStream(u32 cmd_id, u64 stream, ); } -static Result _capscControlCmdInU8NoOut(u32 cmd_id, u8 inval) { +static Result _capscControlCmdInU64NoOut(u32 cmd_id, u64 inval) { if (hosversionBefore(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); if (!serviceIsActive(&g_capscControl)) @@ -197,7 +197,7 @@ Result capscOpenAlbumMovieReadStream(u64 *stream, const CapsAlbumFileId *file_id } Result capscCloseAlbumMovieStream(u64 stream) { - return _capscControlCmdInU8NoOut(2002, stream); + return _capscControlCmdInU64NoOut(2002, stream); } Result capscGetAlbumMovieStreamSize(u64 stream, u64 *size) { @@ -213,7 +213,7 @@ Result capscReadMovieDataFromAlbumMovieReadStream(u64 stream, u64 offset, void* } Result capscGetAlbumMovieReadStreamBrokenReason(u64 stream) { - return _capscControlCmdInU8NoOut(2005, stream); + return _capscControlCmdInU64NoOut(2005, stream); } Result capscGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) { @@ -252,45 +252,43 @@ Result capscOpenAlbumMovieWriteStream(u64 *stream, const CapsAlbumFileId *file_i } Result capscFinishAlbumMovieWriteStream(u64 stream) { - return _capscControlCmdInU8NoOut(2402, stream); + return _capscControlCmdInU64NoOut(2402, stream); } Result capscCommitAlbumMovieWriteStream(u64 stream) { - return _capscControlCmdInU8NoOut(2403, stream); + return _capscControlCmdInU64NoOut(2403, stream); } Result capscDiscardAlbumMovieWriteStream(u64 stream) { - return _capscControlCmdInU8NoOut(2404, stream); + return _capscControlCmdInU64NoOut(2404, stream); } Result capscDiscardAlbumMovieWriteStreamNoDelete(u64 stream) { - return _capscControlCmdInU8NoOut(2405, stream); + return _capscControlCmdInU64NoOut(2405, stream); } -Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumCommitOutput *out) { +Result capscCommitAlbumMovieWriteStreamEx(u64 stream, CapsAlbumEntry *entry) { if (hosversionBefore(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - if (!serviceIsActive(&g_capscControl)) return MAKERESULT(Module_Libnx, LibnxError_NotInitialized); - - return serviceDispatchInOut(&g_capscControl, 2406, stream, *out); + return serviceDispatchInOut(&g_capscControl, 2406, stream, *entry); } Result capscStartAlbumMovieWriteStreamDataSection(u64 stream) { - return _capscControlCmdInU8NoOut(2411, stream); + return _capscControlCmdInU64NoOut(2411, stream); } Result capscEndAlbumMovieWriteStreamDataSection(u64 stream) { - return _capscControlCmdInU8NoOut(2412, stream); + return _capscControlCmdInU64NoOut(2412, stream); } Result capscStartAlbumMovieWriteStreamMetaSection(u64 stream) { - return _capscControlCmdInU8NoOut(2413, stream); + return _capscControlCmdInU64NoOut(2413, stream); } Result capscEndAlbumMovieWriteStreamMetaSection(u64 stream) { - return _capscControlCmdInU8NoOut(2414, stream); + return _capscControlCmdInU64NoOut(2414, stream); } Result capscReadDataFromAlbumMovieWriteStream(u64 stream, u64 offset, void* buffer, u64 size, u64 *actual_size) { @@ -321,7 +319,7 @@ Result capscWriteMetaToAlbumMovieWriteStream(u64 stream, u64 offset, void* buffe } Result capscGetAlbumMovieWriteStreamBrokenReason(u64 stream) { - return _capscControlCmdInU8NoOut(2431, stream); + return _capscControlCmdInU64NoOut(2431, stream); } Result capscGetAlbumMovieWriteStreamDataSize(u64 stream, u64 *size) {