Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aed34f6d28 |
@@ -276,7 +276,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 36;
|
CURRENT_PROJECT_VERSION = 37;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"meetingnotes/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"meetingnotes/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = G9LVHZAJNX;
|
DEVELOPMENT_TEAM = G9LVHZAJNX;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -290,7 +290,7 @@
|
|||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 15.0;
|
MACOSX_DEPLOYMENT_TARGET = 15.0;
|
||||||
MARKETING_VERSION = 1.1.24;
|
MARKETING_VERSION = 1.1.25;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) -D ENABLE_TCC_SPI";
|
OTHER_SWIFT_FLAGS = "$(inherited) -D ENABLE_TCC_SPI";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = net.jamesbone.meetingnotes;
|
PRODUCT_BUNDLE_IDENTIFIER = net.jamesbone.meetingnotes;
|
||||||
@@ -312,7 +312,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 36;
|
CURRENT_PROJECT_VERSION = 37;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"meetingnotes/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"meetingnotes/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = G9LVHZAJNX;
|
DEVELOPMENT_TEAM = G9LVHZAJNX;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 15.0;
|
MACOSX_DEPLOYMENT_TARGET = 15.0;
|
||||||
MARKETING_VERSION = 1.1.24;
|
MARKETING_VERSION = 1.1.25;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) -D ENABLE_TCC_SPI";
|
OTHER_SWIFT_FLAGS = "$(inherited) -D ENABLE_TCC_SPI";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = net.jamesbone.meetingnotes;
|
PRODUCT_BUNDLE_IDENTIFIER = net.jamesbone.meetingnotes;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Implemented:
|
|||||||
- Meeting search functionality
|
- Meeting search functionality
|
||||||
- Abilty to edit system prompt
|
- Abilty to edit system prompt
|
||||||
- Select any compatible Coder model for transcription and note generation
|
- Select any compatible Coder model for transcription and note generation
|
||||||
- Automatic start and stop from MuteDeck through a compatible local API
|
- Automatic start and stop from MuteDeck through a compatible local API, with a 10-second reconnect grace period
|
||||||
- Merge an automatically split continuation back into its previous meeting
|
- Merge an automatically split continuation back into its previous meeting
|
||||||
- Auto updates
|
- Auto updates
|
||||||
- Text formatting
|
- Text formatting
|
||||||
|
|||||||
@@ -200,7 +200,9 @@ private final class LocalRecordingController {
|
|||||||
static let shared = LocalRecordingController()
|
static let shared = LocalRecordingController()
|
||||||
|
|
||||||
private let recordingManager = RecordingSessionManager.shared
|
private let recordingManager = RecordingSessionManager.shared
|
||||||
|
private let stopGraceNanoseconds: UInt64 = 10_000_000_000
|
||||||
private var isStopping = false
|
private var isStopping = false
|
||||||
|
private var pendingStopTask: Task<Void, Never>?
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
|
|
||||||
@@ -237,6 +239,12 @@ private final class LocalRecordingController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func startRecording() throws -> [String: Any] {
|
func startRecording() throws -> [String: Any] {
|
||||||
|
if let pendingStopTask {
|
||||||
|
pendingStopTask.cancel()
|
||||||
|
self.pendingStopTask = nil
|
||||||
|
isStopping = false
|
||||||
|
return statusPayload()
|
||||||
|
}
|
||||||
if isStopping || recordingManager.isProcessing {
|
if isStopping || recordingManager.isProcessing {
|
||||||
throw LocalRecordingError.processing
|
throw LocalRecordingError.processing
|
||||||
}
|
}
|
||||||
@@ -258,14 +266,22 @@ private final class LocalRecordingController {
|
|||||||
return statusPayload()
|
return statusPayload()
|
||||||
}
|
}
|
||||||
isStopping = true
|
isStopping = true
|
||||||
Task { [weak self] in
|
pendingStopTask = Task { [weak self] in
|
||||||
|
try? await Task.sleep(nanoseconds: self?.stopGraceNanoseconds ?? 0)
|
||||||
|
guard !Task.isCancelled else { return }
|
||||||
await self?.finishRecording()
|
await self?.finishRecording()
|
||||||
}
|
}
|
||||||
return statusPayload()
|
return statusPayload()
|
||||||
}
|
}
|
||||||
|
|
||||||
func cancelRecording() -> [String: Any] {
|
func cancelRecording() -> [String: Any] {
|
||||||
guard !isStopping else { return statusPayload() }
|
if let pendingStopTask {
|
||||||
|
pendingStopTask.cancel()
|
||||||
|
self.pendingStopTask = nil
|
||||||
|
isStopping = false
|
||||||
|
} else if isStopping {
|
||||||
|
return statusPayload()
|
||||||
|
}
|
||||||
let meetingID = recordingManager.activeMeetingId
|
let meetingID = recordingManager.activeMeetingId
|
||||||
recordingManager.cancelRecording()
|
recordingManager.cancelRecording()
|
||||||
if let meetingID,
|
if let meetingID,
|
||||||
@@ -277,6 +293,7 @@ private final class LocalRecordingController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func finishRecording() async {
|
private func finishRecording() async {
|
||||||
|
pendingStopTask = nil
|
||||||
let meetingID = recordingManager.activeMeetingId
|
let meetingID = recordingManager.activeMeetingId
|
||||||
let chunks = await recordingManager.stopRecording()
|
let chunks = await recordingManager.stopRecording()
|
||||||
guard let meetingID,
|
guard let meetingID,
|
||||||
|
|||||||
Reference in New Issue
Block a user