diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h
index 18f5c32a18e4..967d4e1693ec 100644
--- a/include/libcamera/internal/camera.h
+++ b/include/libcamera/internal/camera.h
@@ -35,6 +35,10 @@ public:
 	PipelineHandler *pipe() { return pipe_.get(); }
 	const PipelineHandler *pipe() const { return pipe_.get(); }
 
+	void emitBufferCompleted(Request *request, FrameBuffer *buffer);
+	void emitRequestCompleted(Request *request);
+	void emitDisconnected();
+
 	std::list<Request *> queuedRequests_;
 	ControlInfoMap controlInfo_;
 	ControlList properties_;
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index c180a5fdde93..c3e656cab671 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -737,6 +737,25 @@ void Camera::Private::setState(State state)
 {
 	state_.store(state, std::memory_order_release);
 }
+
+void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer)
+{
+	Camera *camera = _o<Camera>();
+	camera->bufferCompleted.emit(request, buffer);
+}
+
+void Camera::Private::emitRequestCompleted(Request *request)
+{
+	Camera *camera = _o<Camera>();
+	camera->requestCompleted.emit(request);
+}
+
+void Camera::Private::emitDisconnected()
+{
+	Camera *camera = _o<Camera>();
+	camera->disconnected.emit();
+}
+
 #endif /* __DOXYGEN_PUBLIC__ */
 
 /**
@@ -947,7 +966,7 @@ void Camera::disconnect()
 	LOG(Camera, Debug) << "Disconnecting camera " << id();
 
 	_d()->disconnect();
-	disconnected.emit();
+	_d()->emitDisconnected();
 }
 
 int Camera::exportFrameBuffers(Stream *stream,
@@ -1451,7 +1470,7 @@ void Camera::requestComplete(Request *request)
 				  true))
 		LOG(Camera, Fatal) << "Trying to complete a request when stopped";
 
-	requestCompleted.emit(request);
+	_d()->emitRequestCompleted(request);
 }
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index d84dff3c9f19..b5faaae08d4c 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -527,7 +527,7 @@ void PipelineHandler::doQueueRequests()
 bool PipelineHandler::completeBuffer(Request *request, FrameBuffer *buffer)
 {
 	Camera *camera = request->_d()->camera();
-	camera->bufferCompleted.emit(request, buffer);
+	camera->_d()->emitBufferCompleted(request, buffer);
 	return request->_d()->completeBuffer(buffer);
 }
 
diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 7f1e11e8f913..b4ae0f41a34c 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -137,7 +137,7 @@ void Request::Private::doCancelRequest()
 
 	for (FrameBuffer *buffer : pending_) {
 		buffer->_d()->cancel();
-		camera_->bufferCompleted.emit(request, buffer);
+		camera_->_d()->emitBufferCompleted(request, buffer);
 	}
 
 	cancelled_ = true;
