Skip to content

Commit

Permalink
.NET SDK (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
albho authored Sep 11, 2024
1 parent 49b4c19 commit efd8e74
Show file tree
Hide file tree
Showing 23 changed files with 2,358 additions and 1 deletion.
36 changes: 36 additions & 0 deletions .github/workflows/dotnet-codestyle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: .NET Codestyle

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'binding/dotnet/**/*.cs'
- 'demo/dotnet/**/*.cs'
- '.github/workflows/dotnet-codestyle.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- 'binding/dotnet/**/*.cs'
- 'demo/dotnet/**/*.cs'
- '.github/workflows/dotnet-codestyle.yml'

jobs:
check-dotnet-codestyle:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up .NET 8.0
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x

- name: Run Binding Codestyle
run: dotnet format --verify-no-changes
working-directory: binding/dotnet

- name: Run Demo Codestyle
run: dotnet format --verify-no-changes
working-directory: demo/dotnet
66 changes: 66 additions & 0 deletions .github/workflows/dotnet-demo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: .NET Demo

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'demo/dotnet/**'
- '!demo/dotnet/README.md'
- '.github/workflows/dotnet-demo.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- 'demo/dotnet/**'
- '!demo/dotnet/README.md'
- '.github/workflows/dotnet-demo.yml'

defaults:
run:
working-directory: demo/dotnet/PvSpeakerDemo
shell: bash

jobs:
build-github-hosted:
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
include:
- os: ubuntu-latest
pv_speaker_platform: linux
- os: windows-latest
pv_speaker_platform: windows
- os: macos-latest
pv_speaker_platform: mac

steps:
- uses: actions/checkout@v3

- name: Set up .NET 8.0
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x

- name: Build .NET demo
run: dotnet build

- name: Run .NET demo
run: dotnet run -- --show_audio_devices

build-self-hosted:
runs-on: ${{ matrix.machine }}

strategy:
matrix:
machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-32, rpi5-64]

steps:
- uses: actions/checkout@v3

- name: Build .NET demo
run: dotnet build

- name: Run .NET demo
run: dotnet run -- --show_audio_devices
85 changes: 85 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: .NET

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'binding/dotnet/**'
- '!binding/dotnet/README.md'
- 'lib/linux/**'
- 'lib/mac/**'
- 'lib/raspberry-pi/**'
- 'lib/windows/**'
- '.github/workflows/dotnet.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- 'binding/dotnet/**'
- '!binding/dotnet/README.md'
- 'lib/linux/**'
- 'lib/mac/**'
- 'lib/raspberry-pi/**'
- 'lib/windows/**'
- '.github/workflows/dotnet.yml'

defaults:
run:
working-directory: binding/dotnet

jobs:
build-github-hosted:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
dotnet-version: [2.1.x, 3.0.x, 3.1.x, 5.0.x, 6.0.x, 8.0.x]
include:
- dotnet-version: 2.1.x
binding-framework: netstandard2.0
test-framework: netcoreapp2.1
- dotnet-version: 3.0.x
binding-framework: netcoreapp3.0
test-framework: netcoreapp3.0
- dotnet-version: 3.1.x
binding-framework: netcoreapp3.0
test-framework: netcoreapp3.1
- dotnet-version: 5.0.x
binding-framework: netcoreapp3.0
test-framework: net5.0
- dotnet-version: 6.0.x
binding-framework: net6.0
test-framework: net6.0
- dotnet-version: 8.0.x
binding-framework: net8.0
test-framework: net8.0

steps:
- uses: actions/checkout@v3

- name: Set up .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: ${{ matrix.dotnet-version }}

- name: Build binding
run: dotnet build PvSpeaker/PvSpeaker.csproj --framework ${{ matrix.binding-framework }}

- name: Test
run: dotnet test --framework ${{ matrix.test-framework }} -v n

build-self-hosted:
runs-on: ${{ matrix.machine }}

strategy:
matrix:
machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-32, rpi5-64, pv-windows, pv-ios]

steps:
- uses: actions/checkout@v3

- name: Build binding
run: dotnet build PvSpeaker/PvSpeaker.csproj --framework net8.0

- name: Test
run: dotnet test --framework net8.0 -v n
83 changes: 82 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# PvSpeaker

<!-- markdown-link-check-disable -->
[![PyPI](https://img.shields.io/pypi/v/pvspeaker)](https://pypi.org/project/pvspeaker/)
[![npm](https://img.shields.io/npm/v/@picovoice/pvspeaker-node?label=npm%20%5Bnode%5D)](https://www.npmjs.com/package/@picovoice/pvspeaker-node)
[![Nuget](https://img.shields.io/nuget/v/pvspeaker)](https://www.nuget.org/packages/PvSpeaker/)
[![PyPI](https://img.shields.io/pypi/v/pvspeaker)](https://pypi.org/project/pvspeaker/)
<!-- markdown-link-check-enable -->

Made in Vancouver, Canada by [Picovoice](https://picovoice.ai)
Expand All @@ -20,10 +21,12 @@ PvSpeaker is an easy-to-use, cross-platform audio player designed for real-time
- [Source Code](#source-code)
- [Demos](#demos)
- [Python](#python-demo)
- [.NET](#net-demo)
- [Node.js](#nodejs-demo)
- [C](#c-demo)
- [SDKs](#sdks)
- [Python](#python)
- [.NET](#net)
- [Node.js](#nodejs)

## Source Code
Expand Down Expand Up @@ -69,6 +72,24 @@ Replace `{INPUT_WAV_PATH}` with the path to the PCM WAV file you wish to play.

For more information about the Python demos go to [demo/python](demo/python).

### .NET Demo

From [demo/dotnet/PvSpeakerDemo](demo/dotnet/PvSpeakerDemo) run the
following in the terminal to build the demo:

```console
dotnet build
```

Make sure there is a working speaker connected to your device. From [demo/dotnet/PvSpeakerDemo](demo/dotnet/PvSpeakerDemo) run the
following in the terminal:

```console
dotnet run -- --input_wav_path ${INPUT_WAV_FILE}
```

For more information about the .NET demo, go to [demo/dotnet](demo/dotnet).

### Node.js Demo

Install the demo package:
Expand Down Expand Up @@ -179,6 +200,66 @@ speaker.delete()

For more information about the PvSpeaker Python SDK, go to [binding/python](binding/python).

### .NET

Install the .NET SDK using NuGet or the dotnet CLI:

```console
dotnet add package PvSpeaker
```

## Usage

Initialize and start `PvSpeaker`:

```csharp
using Pv;

var speaker = new PvSpeaker(
sampleRate: 22050,
bitsPerSample: 16);

speaker.Start();
```

Write PCM data to the speaker:

```csharp
public static byte[] GetNextAudioFrame() { }

int writtenLength = speaker.Write(GetNextAudioFrame());
```

Note: the `Write()` method only writes as much PCM data as the internal circular buffer can currently fit, and returns the number of samples that were successfully written.

When all frames have been written, run `Flush()` to wait for all buffered PCM data (i.e. previously buffered via `Write()`) to be played:

```csharp
int flushedLength = speaker.Flush();
```

Note: calling `Flush()` with PCM data as an argument will both write that PCM data and wait for all buffered PCM data to finish.

```csharp
public static byte[] GetRemainingAudioFrames() { }

int flushedLength = speaker.Flush(GetRemainingAudioFrames());
```

To stop the audio output device, run `Stop()`:

```csharp
speaker.Stop();
```

Once you are done, free the resources acquired by PvSpeaker. You do not have to call `Stop()` before `Dispose()`:

```csharp
speaker.Dispose();
```

For more information about the PvSpeaker .NET SDK, go to [binding/dotnet](binding/dotnet).

### Node.js

Install Node.js binding:
Expand Down
Loading

0 comments on commit efd8e74

Please sign in to comment.