init
This commit is contained in:
parent
b52cb198b5
commit
8d325b96ea
4 changed files with 47 additions and 42 deletions
|
|
@ -8,9 +8,10 @@ import { code2hash, getDrawContext, logger, silence } from '@strudel.cycles/core
|
||||||
import cx from '@src/cx.mjs';
|
import cx from '@src/cx.mjs';
|
||||||
import { transpiler } from '@strudel.cycles/transpiler';
|
import { transpiler } from '@strudel.cycles/transpiler';
|
||||||
import { getAudioContext, initAudioOnFirstClick, webaudioOutput } from '@strudel.cycles/webaudio';
|
import { getAudioContext, initAudioOnFirstClick, webaudioOutput } from '@strudel.cycles/webaudio';
|
||||||
import { defaultAudioDeviceName, getAudioDevices, setAudioDevice } from './panel/AudioDeviceSelector';
|
import { defaultAudioDeviceName } from '../settings.mjs';
|
||||||
|
import { getAudioDevices, setAudioDevice } from './util.mjs';
|
||||||
import { StrudelMirror, defaultSettings } from '@strudel/codemirror';
|
import { StrudelMirror, defaultSettings } from '@strudel/codemirror';
|
||||||
import { createContext, useCallback, useEffect, useRef, useState } from 'react';
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
import {
|
import {
|
||||||
initUserCode,
|
initUserCode,
|
||||||
setActivePattern,
|
setActivePattern,
|
||||||
|
|
@ -24,12 +25,11 @@ import Loader from './Loader';
|
||||||
import { Panel } from './panel/Panel';
|
import { Panel } from './panel/Panel';
|
||||||
import { useStore } from '@nanostores/react';
|
import { useStore } from '@nanostores/react';
|
||||||
import { prebake } from './prebake.mjs';
|
import { prebake } from './prebake.mjs';
|
||||||
import { getRandomTune, initCode, loadModules, shareCode } from './util.mjs';
|
import { getRandomTune, initCode, loadModules, shareCode, ReplContext } from './util.mjs';
|
||||||
import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon';
|
import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon';
|
||||||
import './Repl.css';
|
import './Repl.css';
|
||||||
|
|
||||||
const { code: randomTune, name } = getRandomTune();
|
const { code: randomTune, name } = getRandomTune();
|
||||||
export const ReplContext = createContext(null);
|
|
||||||
|
|
||||||
const { latestCode } = settingsMap.get();
|
const { latestCode } = settingsMap.get();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,8 @@
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { getAudioContext, initializeAudioOutput, setDefaultAudioContext } from '@strudel.cycles/webaudio';
|
import { getAudioDevices, setAudioDevice } from '../util.mjs';
|
||||||
import { SelectInput } from './SelectInput';
|
import { SelectInput } from './SelectInput';
|
||||||
import { logger } from '@strudel.cycles/core';
|
|
||||||
|
|
||||||
const initdevices = new Map();
|
const initdevices = new Map();
|
||||||
export const defaultAudioDeviceName = 'System Standard';
|
|
||||||
|
|
||||||
export const getAudioDevices = async () => {
|
|
||||||
await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
||||||
let mediaDevices = await navigator.mediaDevices.enumerateDevices();
|
|
||||||
mediaDevices = mediaDevices.filter((device) => device.kind === 'audiooutput' && device.deviceId !== 'default');
|
|
||||||
const devicesMap = new Map();
|
|
||||||
devicesMap.set(defaultAudioDeviceName, '');
|
|
||||||
mediaDevices.forEach((device) => {
|
|
||||||
devicesMap.set(device.label, device.deviceId);
|
|
||||||
});
|
|
||||||
return devicesMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const setAudioDevice = async (id) => {
|
|
||||||
let audioCtx = getAudioContext();
|
|
||||||
if (audioCtx.sinkId === id) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await audioCtx.suspend();
|
|
||||||
await audioCtx.close();
|
|
||||||
audioCtx = setDefaultAudioContext();
|
|
||||||
await audioCtx.resume();
|
|
||||||
const isValidID = (id ?? '').length > 0;
|
|
||||||
if (isValidID) {
|
|
||||||
try {
|
|
||||||
await audioCtx.setSinkId(id);
|
|
||||||
} catch {
|
|
||||||
logger('failed to set audio interface', 'warning');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
initializeAudioOutput();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Allows the user to select an audio interface for Strudel to play through
|
// Allows the user to select an audio interface for Strudel to play through
|
||||||
export function AudioDeviceSelector({ audioDeviceName, onChange, isDisabled }) {
|
export function AudioDeviceSelector({ audioDeviceName, onChange, isDisabled }) {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
import { controls, evalScope, hash2code, logger } from '@strudel.cycles/core';
|
import { controls, evalScope, hash2code, logger } from '@strudel.cycles/core';
|
||||||
import { settingPatterns } from '../settings.mjs';
|
import { settingPatterns, defaultAudioDeviceName } from '../settings.mjs';
|
||||||
|
import { getAudioContext, initializeAudioOutput, setDefaultAudioContext } from '@strudel.cycles/webaudio';
|
||||||
|
|
||||||
import { isTauri } from '../tauri.mjs';
|
import { isTauri } from '../tauri.mjs';
|
||||||
import './Repl.css';
|
import './Repl.css';
|
||||||
import * as tunes from './tunes.mjs';
|
import * as tunes from './tunes.mjs';
|
||||||
import { createClient } from '@supabase/supabase-js';
|
import { createClient } from '@supabase/supabase-js';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import { writeText } from '@tauri-apps/api/clipboard';
|
import { writeText } from '@tauri-apps/api/clipboard';
|
||||||
|
import { createContext } from 'react';
|
||||||
|
|
||||||
// Create a single supabase client for interacting with your database
|
// Create a single supabase client for interacting with your database
|
||||||
const supabase = createClient(
|
const supabase = createClient(
|
||||||
|
|
@ -110,3 +113,37 @@ export async function shareCode(codeToShare) {
|
||||||
logger(message);
|
logger(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const ReplContext = createContext(null);
|
||||||
|
|
||||||
|
export const getAudioDevices = async () => {
|
||||||
|
await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||||
|
let mediaDevices = await navigator.mediaDevices.enumerateDevices();
|
||||||
|
mediaDevices = mediaDevices.filter((device) => device.kind === 'audiooutput' && device.deviceId !== 'default');
|
||||||
|
const devicesMap = new Map();
|
||||||
|
devicesMap.set(defaultAudioDeviceName, '');
|
||||||
|
mediaDevices.forEach((device) => {
|
||||||
|
devicesMap.set(device.label, device.deviceId);
|
||||||
|
});
|
||||||
|
return devicesMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setAudioDevice = async (id) => {
|
||||||
|
let audioCtx = getAudioContext();
|
||||||
|
if (audioCtx.sinkId === id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await audioCtx.suspend();
|
||||||
|
await audioCtx.close();
|
||||||
|
audioCtx = setDefaultAudioContext();
|
||||||
|
await audioCtx.resume();
|
||||||
|
const isValidID = (id ?? '').length > 0;
|
||||||
|
if (isValidID) {
|
||||||
|
try {
|
||||||
|
await audioCtx.setSinkId(id);
|
||||||
|
} catch {
|
||||||
|
logger('failed to set audio interface', 'warning');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
initializeAudioOutput();
|
||||||
|
};
|
||||||
|
|
@ -2,9 +2,10 @@ import { persistentMap, persistentAtom } from '@nanostores/persistent';
|
||||||
import { useStore } from '@nanostores/react';
|
import { useStore } from '@nanostores/react';
|
||||||
import { register } from '@strudel.cycles/core';
|
import { register } from '@strudel.cycles/core';
|
||||||
import * as tunes from './repl/tunes.mjs';
|
import * as tunes from './repl/tunes.mjs';
|
||||||
import { defaultAudioDeviceName } from './repl/panel/AudioDeviceSelector';
|
|
||||||
import { logger } from '@strudel.cycles/core';
|
import { logger } from '@strudel.cycles/core';
|
||||||
|
|
||||||
|
export const defaultAudioDeviceName = 'System Standard';
|
||||||
|
|
||||||
export const defaultSettings = {
|
export const defaultSettings = {
|
||||||
activeFooter: 'intro',
|
activeFooter: 'intro',
|
||||||
keybindings: 'codemirror',
|
keybindings: 'codemirror',
|
||||||
|
|
@ -171,6 +172,7 @@ export function updateUserCode(code) {
|
||||||
setActivePattern(example);
|
setActivePattern(example);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!activePattern) {
|
if (!activePattern) {
|
||||||
// create new user pattern
|
// create new user pattern
|
||||||
activePattern = newUserPattern();
|
activePattern = newUserPattern();
|
||||||
|
|
@ -241,4 +243,4 @@ export async function exportPatterns() {
|
||||||
document.body.appendChild(downloadLink);
|
document.body.appendChild(downloadLink);
|
||||||
downloadLink.click();
|
downloadLink.click();
|
||||||
document.body.removeChild(downloadLink);
|
document.body.removeChild(downloadLink);
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue