Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dotnet binding #11

Merged
merged 23 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading