Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Jeremy Rand | bdf7a85895 | |
Jeremy Rand | 237310dd0f |
|
@ -601,6 +601,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.halcyontouch.ListenerGS;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
|
@ -628,6 +629,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.halcyontouch.ListenerGS;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
|
|
BIN
ListenerGS.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
BIN
ListenerGS.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate
generated
Normal file
Binary file not shown.
|
@ -17,21 +17,6 @@
|
|||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>9D5155EE26A1EF7B0075EBC7</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>9D5155FF26A1EF7C0075EBC7</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>9D51560A26A1EF7C0075EBC7</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>9D62FC5F27C494D700AEE01F</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
|
|
|
@ -104,7 +104,7 @@ class GSConnection : ObservableObject {
|
|||
}
|
||||
|
||||
if (!legalTransition) {
|
||||
logger.error("Illegal requested state transition from \(oldState) to \(newState)")
|
||||
logger.error("Illegal requested state transition from \(oldState, privacy: .public) to \(newState, privacy: .public)")
|
||||
errorOccurred(title: "Bad State Change", message: "Illegal state transition from \(oldState) to \(newState)")
|
||||
} else {
|
||||
state = newState
|
||||
|
@ -126,14 +126,14 @@ class GSConnection : ObservableObject {
|
|||
private func connectionSuccessful()
|
||||
{
|
||||
changeState(newState:.connected)
|
||||
logger.debug("Connected to \(self.destination)")
|
||||
logger.debug("Connected to \(self.destination, privacy: .public)")
|
||||
}
|
||||
|
||||
func connect(destination : String) {
|
||||
self.destination = destination
|
||||
changeState(newState: .connecting)
|
||||
readQueue.addOperation { [weak self, destination] in
|
||||
self?.logger.debug("Attempting to connect to \(destination)")
|
||||
self?.logger.debug("Attempting to connect to \(destination, privacy: .public)")
|
||||
let client = TCPClient(address: destination, port: Int32(GSConnection.port))
|
||||
switch client.connect(timeout: 10) {
|
||||
case .success:
|
||||
|
@ -143,7 +143,7 @@ class GSConnection : ObservableObject {
|
|||
}
|
||||
case .failure(let error):
|
||||
client.close()
|
||||
self?.logger.error("Failed to connect to \(destination): \(String(describing: error))")
|
||||
self?.logger.error("Failed to connect to \(destination, privacy: .public): \(String(describing: error), privacy: .public)")
|
||||
self?.mainQueue.addOperation {
|
||||
self?.connectionFailed()
|
||||
}
|
||||
|
@ -171,13 +171,13 @@ class GSConnection : ObservableObject {
|
|||
self.trySend()
|
||||
}
|
||||
} else {
|
||||
self.logger.error("Unexpected message on socket from \(destination)")
|
||||
self.logger.error("Unexpected message on socket from \(destination, privacy: .public)")
|
||||
self.errorOccurred(title: "Protocol Error", message: "Unexpected message from the GS")
|
||||
break
|
||||
}
|
||||
}
|
||||
catch {
|
||||
self.logger.error("Unable to unpack message on socket from \(destination)")
|
||||
self.logger.error("Unable to unpack message on socket from \(destination, privacy: .public)")
|
||||
self.errorOccurred(title: "Protocol Error", message: "Unexpected message from the GS")
|
||||
break
|
||||
}
|
||||
|
@ -230,7 +230,7 @@ class GSConnection : ObservableObject {
|
|||
case .success:
|
||||
break
|
||||
case .failure(let error):
|
||||
self.logger.error("Unable to send header: \(String(describing: error))")
|
||||
self.logger.error("Unable to send header: \(String(describing: error), privacy: .public)")
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -319,14 +319,14 @@ class GSConnection : ObservableObject {
|
|||
case .success:
|
||||
switch (client.send(data: bytes)) {
|
||||
case .success:
|
||||
logger.debug("Sent text \"\(stringToSend)\"")
|
||||
logger.debug("Sent text \"\(stringToSend, privacy: .public)\"")
|
||||
break
|
||||
case .failure(let error):
|
||||
mainQueue.addOperation {
|
||||
self.errorOccurred(title: "Write Error", message: "Unable to send text to the GS")
|
||||
self.disconnect()
|
||||
}
|
||||
logger.error("Failed to send text: \(String(describing: error))")
|
||||
logger.error("Failed to send text: \(String(describing: error), privacy: .public)")
|
||||
return false
|
||||
}
|
||||
case .failure(let error):
|
||||
|
@ -334,7 +334,7 @@ class GSConnection : ObservableObject {
|
|||
self.errorOccurred(title: "Write Error", message: "Unable to send text to the GS")
|
||||
self.disconnect()
|
||||
}
|
||||
logger.error("Failed to send text: \(String(describing: error))")
|
||||
logger.error("Failed to send text: \(String(describing: error), privacy: .public)")
|
||||
}
|
||||
}
|
||||
return true
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<string>1.0.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>794</string>
|
||||
<string>807</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
|
|
|
@ -82,7 +82,7 @@ class SpeechForwarder : SpeechForwarderProtocol {
|
|||
// Configure the microphone input.
|
||||
let inputFormat = inputNode.outputFormat(forBus: 0)
|
||||
let speechFormat = recognitionRequest.nativeAudioFormat
|
||||
logger.debug("Recording format \(inputFormat), speech format \(speechFormat)")
|
||||
logger.debug("Recording format \(inputFormat, privacy: .public), speech format \(speechFormat, privacy: .public)")
|
||||
var formatConverter: AVAudioConverter?
|
||||
if (!inputFormat.isEqual(speechFormat)) {
|
||||
formatConverter = AVAudioConverter(from:inputFormat, to: speechFormat)
|
||||
|
@ -114,17 +114,17 @@ class SpeechForwarder : SpeechForwarderProtocol {
|
|||
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { [weak connection] result, error in
|
||||
var isFinal = false
|
||||
|
||||
if let result = result {
|
||||
// Update the text view with the results.
|
||||
OperationQueue.main.addOperation {
|
||||
guard let connection = connection else { return }
|
||||
connection.set(text: result.bestTranscription.formattedString)
|
||||
}
|
||||
isFinal = result.isFinal
|
||||
}
|
||||
|
||||
if error != nil {
|
||||
self.logger.error("Error from recognizer: \(String(describing: error))")
|
||||
self.logger.error("Error from recognizer: \(String(describing: error), privacy:.public)")
|
||||
} else if let result = result {
|
||||
isFinal = result.isFinal
|
||||
if !isFinal || result.bestTranscription.formattedString != "" {
|
||||
// Update the text view with the results.
|
||||
OperationQueue.main.addOperation {
|
||||
guard let connection = connection else { return }
|
||||
connection.set(text: result.bestTranscription.formattedString)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if error != nil || isFinal {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# ListenerGS
|
||||
|
||||
This is an iOS app that connects to an Apple IIgs over a network and streams text to it from voice dicatation. It communicates to the [Listen NDA](https://github.com/jeremysrand/Listener) which must be running on your network capable Apple IIgs. See that other project for more details about how to use this app.
|
||||
This is an iOS/iPadOS/macOS app that connects to an Apple IIgs over a network and streams text to it from voice dicatation. It communicates to the [Listen NDA](https://github.com/jeremysrand/Listener) which must be running on your network capable Apple IIgs. See that other project for more details about how to use this app.
|
||||
|
||||
## Obtaining a Copy
|
||||
|
||||
I am getting close to making this available as a release that anyone can obtain. It is currently in beta test and the iOS and macOS app have passed Apple's beta testing review. That doesn't mean that the app will pass full review but I am hopeful. So, perhaps soon I will be able to provide a link for where to download this for yourself.
|
||||
The app is now [available from the AppStore](https://apps.apple.com/us/app/listenergs/id1613273510?itsct=apps_box_badge&itscg=30200). Also, you can find [zip archive of the macOS version](https://github.com/jeremysrand/ListenerApp/releases/download/v1.0/ListenerGS.zip) if you prefer to get your Mac software outside of the store. You should also visit [rand-emonium.com](https://www.rand-emonium.com/listenergs/) to get links to the software for your Apple IIGS and information about using it.
|
||||
|
||||
## Some Technical Details
|
||||
|
||||
|
|
Loading…
Reference in New Issue