diff --git a/headers/private/media/DataExchange.h b/headers/private/media/DataExchange.h index 2ce017f7af..06120094c4 100644 --- a/headers/private/media/DataExchange.h +++ b/headers/private/media/DataExchange.h @@ -139,8 +139,10 @@ enum { SERVER_GET_MEDIA_FILE_ITEMS, SERVER_GET_REF_FOR, SERVER_SET_REF_FOR, - SERVER_REMOVE_REF_FOR, + SERVER_INVALIDATE_MEDIA_ITEM, SERVER_REMOVE_MEDIA_ITEM, + SERVER_GET_ITEM_AUDIO_GAIN, + SERVER_SET_ITEM_AUDIO_GAIN, SERVER_GET_FORMAT_FOR_DESCRIPTION, SERVER_GET_DESCRIPTION_FOR_FORMAT, SERVER_GET_READERS, @@ -800,12 +802,12 @@ struct server_set_ref_for_request : request_data { struct server_set_ref_for_reply : reply_data { }; -struct server_remove_ref_for_request : request_data { +struct server_invalidate_item_request : request_data { char type[B_MEDIA_NAME_LENGTH]; char item[B_MEDIA_NAME_LENGTH]; }; -struct server_remove_ref_for_reply : reply_data { +struct server_invalidate_item_reply : reply_data { }; struct server_remove_media_item_request : request_data { @@ -816,6 +818,24 @@ struct server_remove_media_item_request : request_data { struct server_remove_media_item_reply : reply_data { }; +struct server_get_item_audio_gain_request : request_data { + char type[B_MEDIA_NAME_LENGTH]; + char item[B_MEDIA_NAME_LENGTH]; +}; + +struct server_get_item_audio_gain_reply : reply_data { + float gain; +}; + +struct server_set_item_audio_gain_request : request_data { + char type[B_MEDIA_NAME_LENGTH]; + char item[B_MEDIA_NAME_LENGTH]; + float gain; +}; + +struct server_set_item_audio_gain_reply : reply_data { +}; + struct server_get_decoder_for_format_request : request_data { media_format format; }; diff --git a/src/kits/media/MediaFiles.cpp b/src/kits/media/MediaFiles.cpp index bf00d0f0ab..77bdde3091 100644 --- a/src/kits/media/MediaFiles.cpp +++ b/src/kits/media/MediaFiles.cpp @@ -162,11 +162,26 @@ BMediaFiles::GetRefFor(const char* type, const char* item, entry_ref* _ref) status_t -BMediaFiles::GetAudioGainFor(const char* type, const char* item, - float* _audioGain) +BMediaFiles::GetAudioGainFor(const char* type, const char* item, float* _gain) { - UNIMPLEMENTED(); - *_audioGain = 1.0f; + CALLED(); + + if (type == NULL || item == NULL || _gain == NULL) + return B_BAD_VALUE; + + server_get_item_audio_gain_request request; + strncpy(request.type, type, B_MEDIA_NAME_LENGTH); + strncpy(request.item, item, B_MEDIA_NAME_LENGTH); + + server_get_item_audio_gain_reply reply; + status_t status = QueryServer(SERVER_GET_ITEM_AUDIO_GAIN, &request, + sizeof(request), &reply, sizeof(reply)); + if (status != B_OK) { + ERROR("BMediaFiles::GetRefFor: failed: %s\n", strerror(status)); + return status; + } + + *_gain = reply.gain; return B_OK; } @@ -195,10 +210,23 @@ BMediaFiles::SetRefFor(const char* type, const char* item, status_t -BMediaFiles::SetAudioGainFor(const char* type, const char* item, - float audioGain) +BMediaFiles::SetAudioGainFor(const char* type, const char* item, float gain) { - UNIMPLEMENTED(); + CALLED(); + + server_set_item_audio_gain_request request; + strncpy(request.type, type, B_MEDIA_NAME_LENGTH); + strncpy(request.item, item, B_MEDIA_NAME_LENGTH); + request.gain = gain; + + server_set_item_audio_gain_reply reply; + status_t status = QueryServer(SERVER_SET_ITEM_AUDIO_GAIN, &request, + sizeof(request), &reply, sizeof(reply)); + if (status != B_OK) { + ERROR("BMediaFiles::SetAudioGainFor: failed: %s\n", strerror(status)); + return status; + } + return B_OK; } @@ -209,12 +237,12 @@ BMediaFiles::RemoveRefFor(const char* type, const char* item, { CALLED(); - server_remove_ref_for_request request; + server_invalidate_item_request request; strncpy(request.type, type, B_MEDIA_NAME_LENGTH); strncpy(request.item, item, B_MEDIA_NAME_LENGTH); - server_remove_ref_for_reply reply; - status_t status = QueryServer(SERVER_REMOVE_REF_FOR, &request, + server_invalidate_item_reply reply; + status_t status = QueryServer(SERVER_INVALIDATE_MEDIA_ITEM, &request, sizeof(request), &reply, sizeof(reply)); if (status != B_OK) { ERROR("BMediaFiles::RemoveRefFor: failed: %s\n", strerror(status)); diff --git a/src/servers/media/media_server.cpp b/src/servers/media/media_server.cpp index 1b21b8bbf6..77d5e217f5 100644 --- a/src/servers/media/media_server.cpp +++ b/src/servers/media/media_server.cpp @@ -804,11 +804,11 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size) break; } - case SERVER_REMOVE_REF_FOR: + case SERVER_INVALIDATE_MEDIA_ITEM: { - const server_remove_ref_for_request* request - = reinterpret_cast(data); - server_remove_ref_for_reply reply; + const server_invalidate_item_request* request + = reinterpret_cast(data); + server_invalidate_item_reply reply; status_t status = gMediaFilesManager->InvalidateItem( request->type, request->item); @@ -829,6 +829,32 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size) break; } + case SERVER_GET_ITEM_AUDIO_GAIN: + { + const server_get_item_audio_gain_request& request + = *reinterpret_cast( + data); + server_get_item_audio_gain_reply reply; + + status_t status = gMediaFilesManager->GetAudioGainFor(request.type, + request.item, &reply.gain); + request.SendReply(status, &reply, sizeof(reply)); + break; + } + + case SERVER_SET_ITEM_AUDIO_GAIN: + { + const server_set_item_audio_gain_request& request + = *reinterpret_cast( + data); + server_set_ref_for_reply reply; + + status_t status = gMediaFilesManager->SetAudioGainFor(request.type, + request.item, request.gain); + request.SendReply(status, &reply, sizeof(reply)); + break; + } + case SERVER_GET_READERS: { const server_get_readers_request *request