import { Flame } from '../generated/driveningress/v1/driveningress';
import { Avatar } from './Avatar';
import { AnimationPlayer } from '../audio/AnimationPlayer';
import { AvatarState, ConnectionState, AvatarPlaybackMode } from '../types';
export declare class AvatarController {
    private networkLayer?;
    readonly playbackMode: AvatarPlaybackMode;
    protected avatar: Avatar;
    protected animationPlayer: AnimationPlayer | null;
    protected currentKeyframes: Flame[];
    protected pendingAudioChunks: Array<{
        data: Uint8Array;
        isLast: boolean;
    }>;
    protected isPlaying: boolean;
    protected isConnected: boolean;
    protected currentState: AvatarState;
    onConnectionState: ((state: ConnectionState) => void) | null;
    onAvatarState: ((state: AvatarState) => void) | null;
    onError: ((error: Error) => void) | null;
    private eventListeners;
    private renderCallback?;
    private transitionCompleteCallback?;
    private playbackLoopId;
    private lastRenderedFrameIndex;
    constructor(avatar: Avatar, options?: {
        playbackMode?: AvatarPlaybackMode;
    });
    /**
     * 获取 Avatar ID（供 NetworkLayer 使用）
     */
    getAvatarId(): string;
    /**
     * 获取播放状态（供 NetworkLayer 使用）
     */
    getIsPlaying(): boolean;
    /**
     * 设置连接状态（供 NetworkLayer 使用）
     */
    setConnected(connected: boolean): void;
    /**
     * 获取连接状态
     */
    get connected(): boolean;
    /**
     * 获取当前状态
     */
    get state(): AvatarState;
    /**
     * 获取动画播放器实例
     * @internal
     */
    getAnimationPlayer(): AnimationPlayer | null;
    /**
     * 启动服务（仅网络模式）
     */
    start(): Promise<void>;
    /**
     * 发送音频到服务器（仅网络模式）
     * 同时缓存到数据层用于播放
     */
    send(audioData: ArrayBuffer, end?: boolean): void;
    /**
     * 关闭服务（仅网络模式）
     */
    close(): void;
    /**
     * 开始播放（外部数据模式）
     * 必须先调用此方法，传入初始数据开始播放
     */
    play(initialAudioChunks?: Array<{
        data: Uint8Array;
        isLast: boolean;
    }>, initialKeyframes?: Flame[]): Promise<void>;
    /**
     * 发送音频数据（外部数据模式）
     * 在 play() 之后流式添加剩余音频数据
     */
    sendAudioChunk(data: Uint8Array, isLast?: boolean): void;
    /**
     * 发送动画关键帧（外部数据模式或网络模式）
     * 在 play() 之后流式添加剩余动画数据
     */
    sendKeyframes(keyframes: Flame[]): void;
    /**
     * 打断当前播放
     */
    interrupt(): void;
    /**
     * 清理所有数据和资源
     */
    clear(): void;
    /**
     * 开始流式播放（内部方法，由 NetworkLayer 或 play() 调用）
     */
    startStreamingPlayback(): Promise<void>;
    /**
     * 设置渲染回调（由 AvatarView 调用）
     */
    setRenderCallback(callback: (splatData: Float32Array, frameIndex: number) => void): void;
    /**
     * 设置过渡完成回调（由 AvatarView 调用）
     */
    setTransitionCompleteCallback(callback: () => void): void;
    /**
     * 过渡完成通知（由 AvatarView 调用）
     */
    onTransitionComplete(): void;
    /**
     * 为 AvatarView 提供注册内部事件的接口
     * @internal
     */
    setupInternalEventListeners(callbacks: {
        onKeyframesUpdate?: (keyframes: Flame[]) => void;
        onStartRendering?: () => void;
        onStopRendering?: () => void;
        onInterrupt?: () => void;
    }): void;
    /**
     * 开始流式播放（内部实现）
     */
    private startStreamingPlaybackInternal;
    /**
     * 播放循环：根据音频时间计算动画帧，通知渲染层渲染
     */
    private startPlaybackLoop;
    /**
     * 停止播放循环
     */
    private stopPlaybackLoop;
    /**
     * 停止播放
     */
    protected stopPlayback(): void;
    /**
     * 清理播放器
     */
    protected cleanupPlayers(): void;
    /**
     * 添加音频块到缓冲区
     */
    private addAudioChunkToBuffer;
    /**
     * 事件系统
     */
    private registerEventListener;
    /**
     * 触发事件
     */
    protected emit(event: string, data?: any): void;
}
//# sourceMappingURL=AvatarController.d.ts.map